我之前曾问过,但情况已经改变,今天我意识到我之前获得的解决方案存在严重问题。我的算法有些变化。
这是新代码:
fetch(`${baseUrl}api/user/login`, {
withCredentials: true,
headers: myHeaders
})
.then(function(response) {
console.log(response.status); // Will show you the status
if (!response.ok) {
throw new Error("HTTP status " + response.status);
}
return response.json();
})
.then(// ...
使用此解决方案,每次我浏览在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 ? HomePage() : FirstScreen();
},
),
);
}
由于返回值不是小部件,因此它当然不起作用。有解决办法吗?
编辑:感谢Remi,我这样解决了:
@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()));
},
),
);
}
答案 0 :(得分:1)
只需不要使用FututeBuilder
并直接操作Future
:
Future future;
future.then((value) {
Navigator.pushNamed(context, "/foo");
});
请记住,您不应在 build 方法中执行此操作。在创建Future的地方执行此操作,通常是 initState