小部件树中的条件导航
我之前曾问过,但情况已经改变,今天我意识到我之前获得的解决方案存在严重问题。我的算法有些变化。
这是新代码:
@override Widget build(BuildContext context) {
return Material(
child: FutureBuilder(
future: _future,
builder: (context, snapshot) {
if (snapshot.hasData) {
print('BOOT VALUE IS ${snapshot.data}');
}
return !snapshot.hasData
? SplashScreen()
: snapshot.data ? HomePage() : FirstScreen();
},
),
);
}
使用此解决方案,每次我在FutureBuilder中有条件渲染的页面中导航时,BootScreen页面函数都会执行。所以这不是最好的…我需要在Future Builder内部执行导航而没有任何问题,如下所示:
@override Widget build(BuildContext context) {
return Material(
child: FutureBuilder(
future: _future,
builder: (context, snapshot) {
if (snapshot.hasData) {
print('BOOT VALUE IS ${snapshot.data}');
}
return !snapshot.hasData
? SplashScreen()
: snapshot.data
? Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) => HomePage()))
: Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) => FirstScreen()));
},
),
);
}
因为返回值不是小部件,所以它当然不起作用。有什么办法吗?
编辑:感谢雷米,我这样解决了:
@override
void initState() {
final MainModel model = ScopedModel.of(context);
model.bootUp().then(
(value) => Future.delayed(
Duration(seconds: 1, milliseconds: 500),
() {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) =>
value ? HomePage() : FirstScreen()));
},
),
);
super.initState();
}
回答:
只是不要直接使用FututeBuilder和操作Future:
Future future;future.then((value) {
Navigator.pushNamed(context, "/foo");
});
请记住,您不应在build方法中执行此操作。在创建Future的位置执行此操作,通常是initState
以上是 小部件树中的条件导航 的全部内容, 来源链接: utcz.com/qa/400617.html