Flutter,从不渲染调用的父小部件设置 state()

时间:2021-01-27 19:59:55

标签: flutter dart

我有三个屏幕。

  1. 主屏幕。 2 抵押贷款屏幕。 3. 新增分支画面。 [每个抵押贷款可以有一个或多个分支]

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

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

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

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

第 2 页已更新且显示正常。但是,当我从第 2 页返回到第 1 页时,第 1 页还没有更新。即使在第 1 页中调用了 setState 方法。

希望清楚,我会添加第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}
                    // );

                  });
                },
              ),
            ],
          );
        });
  }



}

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

我无法弄清楚这一点。谢谢

1 个答案:

答案 0 :(得分:0)

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