颤振,设置状态()从父部件调用不呈现



我有三个屏幕

  1. 主屏幕。2 .抵押贷款筛选;新的分支屏幕。[每个抵押可以有一个或多个分支]

  2. 主屏幕显示用户结束的所有当前抵押贷款的列表,以及每个抵押贷款中的每个分支的摘要。

  3. 当用户单击屏幕1中列表中的一个抵押贷款时,他将进入屏幕2,其中显示该抵押贷款分支的所有详细信息。用户可以通过点击浮动动作按钮添加新的分支,进入第3页。

  4. 在第3页,用户填写表单以添加新分支。添加分支后,弹出第3页,第2页仍在显示。

当第3页完成时,一个新的分支被添加到所选抵押中,并且应该更新第2页和第1页中显示的数据。我通过将回调方法传递到第2页和第1页,然后在这两个类中调用set state来实现这一点。

第2页已更新,显示良好。但是,当我从第2页回到第1页时,第1页没有更新。尽管setState方法在第1页被调用。

我希望它清楚,我将添加第1页的代码,也许你可以帮我看看为什么页面不重新渲染。

class HomeScreen extends StatefulWidget {

@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
List<MaslulModel> savedMaslulim = <MaslulModel>[];
List<MortgageModel> savedMortgages = <MortgageModel>[];
// THIS METHOD IS CALLED FROM PAGE 2.
notifyHomeScreen() async {
print('2124: notifyHomeScreen called in home_screen');
savedMaslulim.clear();
savedMortgages.clear();
savedMaslulim = await SharedPrefsMethods.getMaslulListFromPrefs();
for (var i = 0; i < savedMaslulim.length; i++) {
print(savedMaslulim[i].getDetails());
}
savedMortgages = sortOutMaslulimToMortgages(savedMaslulim);
setState(() {
print('2124: Set state. Maslul at 0 List size: ${savedMortgages[0].maslulList.length}');
});
}
TextEditingController _textFieldController = TextEditingController();
String codeDialog = '';
String valueText = '';
@override
initState() {
super.initState();
print('InitState');
asyncGetSavedMortgages();
}
void asyncGetSavedMortgages() async {

savedMaslulim = await SharedPrefsMethods.getMaslulListFromPrefs();
savedMortgages = sortOutMaslulimToMortgages(savedMaslulim);
print(savedMortgages.length);

setState(() {
print('Set state called');
});
}


@override
Widget build(BuildContext context) {
for (var i = 0; i < savedMortgages.length; i++) {
if(savedMortgages[i].name=='tonight'){
print('2124: From HOME: ${savedMortgages[i].maslulList.length}');
}
}
return Scaffold(
appBar: AppBar(title: Text(AppLocalizations.of(context)!.translate('my_mortgages'))),
drawer: MainDrawer(),
floatingActionButton: FloatingActionButton.extended(
onPressed: () {
// Navigator.pushNamed(context, '/new_mortgage_screen');
_displayTextInputDialog(context);
},
label: Text('הוסף משכנתא'),
icon: Icon(Icons.add),
backgroundColor: Colors.pink,
),
body:  ListView.builder(
itemCount: savedMortgages.length,
key: Key(savedMortgages.length.toString()),
itemBuilder: (context, index){
for (var i = 0; i < savedMortgages.length; i++) {
if(savedMortgages[i].name=='tonight'){
print('2124: From HOME itemBuilder: ${savedMortgages[i].maslulList.length}');
}
}
return MortgageSummaryWidget(savedMortgages[index], notifyHomeScreen: notifyHomeScreen );
},

),
);
}
Future<void> _displayTextInputDialog(BuildContext context) async {
return showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('הכנס שם של המשנכתא:'),
content: TextField(
onChanged: (value) {
setState(() {
valueText = value;
});
},
controller: _textFieldController,
decoration: InputDecoration(hintText: "שם"),
),
actions: <Widget>[
FlatButton(
color: Colors.white,
textColor: Colors.red,
child: Text('בטל'),
onPressed: () {
setState(() {
Navigator.pop(context);
});
},
),
FlatButton(
color: Colors.blue,
textColor: Colors.white,
child: Text('בצע'),
onPressed: () {
setState(() {
codeDialog = valueText;

if(codeDialog.isEmpty){
showAlertDialog(context, 'שגיאה', 'לא הכנסת שם מסלול');
return;
}
Navigator.pop(context);
// Navigator.pushNamed(context, '/new_mortgage_screen');
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => NewMortgageScreen(notifyParent: notifyHomeScreen, title: codeDialog,)));
// Navigator.pushNamed(
//     context,
//     '/new_mortgage_screen',
//     arguments: {'mortgageName': codeDialog}
// );
});
},
),
],
);
});
}

}

所有的值都更新了,但是屏幕显示没有。

我想不明白。由于

我意识到这个问题,我正在向状态发送一个参数,而这个参数没有得到更新。我将其更改为使用widget.parameter获取参数。

最新更新