myapp中有两个页面,分别是FirstPage和SecondPage。
基本上,FirstPage小部件显示带有项目列表的ListView,而SecondPage小部件是我可以在列表中添加/删除项目的位置。
我可以通过以下方式导航到SecondPage:
Navigator.of(context).pushNamed("/SecondPage");
我也可以使用以下方法返回首页:
Navigator.of(context).pop();
我的问题是,在弹出SecondPage以便更新FirstPage的ListView之后,我不知道如何触发FirstPage小部件的setState方法。
任何提示,我将不胜感激。
答案 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。