弹出第二页后触发FirstPage的setState方法

时间:2018-09-01 02:28:38

标签: dart flutter

myapp中有两个页面,分别是FirstPage和SecondPage。

基本上,FirstPage小部件显示带有项目列表的ListView,而SecondPage小部件是我可以在列表中添加/删除项目的位置。

我可以通过以下方式导航到SecondPage:

Navigator.of(context).pushNamed("/SecondPage");

我也可以使用以下方法返回首页:

Navigator.of(context).pop();

我的问题是,在弹出SecondPage以便更新FirstPage的ListView之后,我不知道如何触发FirstPage小部件的setState方法。

任何提示,我将不胜感激。

3 个答案:

答案 0 :(得分:0)

使用此代码将值从子视图发送到父视图

 Widget build(BuildContext context) {
return new Scaffold(
  appBar: new AppBar(
    title: new Text(widget.title),
  ),
  body: new Center(
      child: new FlatButton(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => SecondView(callBackValue)),
            );
          },
          child: new Text('Open Child Widget'))),
);
}

 //Your Callback Values will be received here
void callBackValue(double value) {
print('Value $value');
}

// Your SecondPage
class SecondView extends StatefulWidget{
    final void Function(double data) callback;
    SecondView(this.callback);

    @override
    _SecondView createState() => new _SecondView();
  }

  class _SecondView extends State<SecondView>{
    @override
    Widget build(BuildContext context) {
      return new Scaffold(
        appBar: new AppBar(
          title: new Text('Child Widget'),
        ),
        body: new Center(
          child: new FlatButton(onPressed: (){
            widget.callback(10.0);
          }, child: new Text('Send Value to parent')),
        ),
      );
    }
  }

答案 1 :(得分:0)

您要实现的目标类似于Android中的startActivityForResult()方法。

这可以通过像这样的颤动来实现:-

第一次活动

  Map map = await Navigator.of(context).push(MaterialPageRoute(builder: (context) => SecondView());

// now it will wait for the secondView to return some data
//and the below code will be executed whenever the second view pops.
  setState((){});

希望这会有所帮助。

也不要忘记在导航的方法声明中写async

  void _navigateToSecondActivity async {
       Map map = await Navigator.of(context).push(MaterialPageRoute(builder: (context) => SecondView());
       setState((){});
  }

当您需要导航到第二个活动时,只需调用此函数即可。

或在您的onTap()

onTap: () async{
  Map map = await Navigator.of(context).push(MaterialPageRoute(builder: (context) => SecondView());
       setState((){});
}

答案 2 :(得分:0)

每当我们推动时,我们都会得到未来,我们可以利用这一未来来触发setState

Future pushNamed = Navigator.of(context).pushNamed("/SecondPage");
pushNamed.then((_)=> setState(() {}));

引用here将数据从secondScreen发送到firstScreen。