flutter: Provider的坑 --- 退出页面时,StatefulWidget又会build一遍?
具体代码如下:_changeLocation(BuildContext context) async {// 1、异步的,通过await等待CityPage页面退出返回数据CityModel city = await NavigatorRoute.pushName(context, CityPage.routeName);if (city == null) {return;}// 2、这里用到了P
·
具体代码如下:
_changeLocation(BuildContext context) async {
// 1、异步的,通过await等待CityPage页面退出返回数据
CityModel city = await NavigatorRoute.pushName(context, CityPage.routeName);
if (city == null) {
return;
}
// 2、这里用到了Provider,其中调用了notifyListeners(),通知监听者更新
context.read<LangProvider>().setCityModel(city);
}
setCityModel(CityModel city) {
_cityModel = city;
notifyListeners();
}
这里的坑点在于,CityPage中并没有监听LangProvider,但却在退出页面,走到setCityModel方法时,又build了一遍,导致页面退出过程中出现异常,页面飘红,虽然只是一闪而逝,并没有对功能造成影响,但个人感觉很不爽!
通过调试,发现问题出现在Route里面,在notifyListeners时,CupertinoPageRoute的build又会走一遍,页面又被创建了。
case CityPage.routeName:
return CupertinoPageRoute(
settings: RouteSettings(name: settings.name),
builder: (context) {
// push的时候会走一次,在pop后,notifyListeners时又走了一次
return CityPage();
},
);
具体原因不明…
解决方案暂为:
_changeLocation(BuildContext context) async {
CityModel city = await NavigatorRoute.pushName(context, CityPage.routeName);
if (city == null) {
return;
}
// 延迟设置下,否则退出来的页面会飘红
Future.delayed(Duration(seconds: 1),(){
context.read<LangProvider>().setCityModel(city);
});
}
更多推荐
已为社区贡献1条内容
所有评论(0)