我之前曾问过,但情况已经改变,今天我意识到我之前获得的解决方案存在严重问题。我的算法有些变化。
这是新代码:
@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