小部件树中的条件导航

我之前曾问过,但情况已经改变,今天我意识到我之前获得的解决方案存在严重问题。我的算法有些变化。

这是新代码:

  @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

回到顶部