例如:我想从Page2返回Page1并刷新Page1。
答案 0 :(得分:5)
当您导航回第一页时,您可以触发API调用,例如伪代码
class PageOne extends StatefulWidget {
@override
_PageOneState createState() => new _PageOneState();
}
class _PageOneState extends State<PageOne> {
_getRequests()async{
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new RaisedButton(onPressed: ()=>
Navigator.of(context).push(new MaterialPageRoute(builder: (_)=>new PageTwo()),)
.then((val)=>val?_getRequests():null),
),
));
}
}
class PageTwo extends StatelessWidget {
@override
Widget build(BuildContext context) {
//somewhere
Navigator.pop(context,true);
}
}
如果API经常更新,您可以使用流,新数据会在ListView
例如使用firebase我们可以做到这一点
stream: FirebaseDatabase.instance.reference().child(
"profiles").onValue
只要您在数据库中更改某些内容(例如,从编辑个人资料页面),它就会反映在您的个人资料页面上。在这种情况下,这是唯一可能的,因为我使用的是onValue
,它会继续监听任何更改并代表您进行更新。
答案 1 :(得分:1)
(在您的第一页):使用此代码导航到第二页。
Navigator.pushNamed(context, '/page2').then((_) {
// This block runs when you have returned back to the 1st Page from 2nd.
setState(() {
// Call setState to refresh the page.
});
});
(在您的第二页):使用此代码返回第一页。
Navigator.pop(context);
答案 2 :(得分:0)
为了获得更细粒度、与页面无关的解决方案,我想出了这个 Android 单个 LiveEvent 模仿行为。
我在 Provider
类中创建了这样的字段,例如:
SingleLiveEvent<int> currentYearConsumable = SingleLiveEvent<int>();
它有一个公共设置器来设置值。公共 consume
允许您仅读取一次值(如果存在)(请求 UI 刷新)。在您需要的地方调用 consume
(例如在 build
方法中)。
您不需要Provider
,您可以使用其他解决方案来传递它。
实施:
/// Useful for page to page communication
/// Mimics Android SingleLiveEvent behaviour
/// https://stackoverflow.com/questions/51781176/is-singleliveevent-actually-part-of-the-android-architecture-components-library
class SingleLiveEvent<T> {
late T _value;
bool _consumed = true;
set(T val) {
_value = val;
_consumed = false;
}
T? consume() {
if (_consumed) {
return null;
} else {
_consumed = true;
return _value;
}
}
}