我从FutureBuilder开始两次遇到问题。 首先,它正确地获取了数据,返回了我的StartScreen,然后几秒钟后,StartScreen重新生成,我注意到FutureBuilder再次启动。
这是我的代码,它很简单,所以我想知道问题可能出在哪里?!?
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
FirebaseUser user;
@override
void initState() {
// TODO: implement initState
super.initState();
getNewestlocation();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'APP',
theme: buildTheme(),
home: FutureBuilder<FirebaseUser>(future: Provider.of<AuthService>(context).getUser(),
builder: (context, AsyncSnapshot<FirebaseUser> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.error != null) {
print('error');
return Text(snapshot.error.toString());
}
user = snapshot.data;
print('user here $user');
return snapshot.hasData ? StartScreen(user) : LoginScreen();
} else {
return LoadingCircle();
}
},
));
}
}
有人可以帮我吗?
答案 0 :(得分:0)
我认为您的代码中有一些不好的地方,也许这不是问题,但可以纠正: 第一:不建议您在主文件中执行此操作,您应该有类似启动页面的内容来进行处理。 第二:您应该使用块,而不要在视图(UI)的同一位置上编写逻辑代码
答案 1 :(得分:0)
将来又要激发了,因为您正在与FutureBuilder同时在build方法中创建它。
将来一定要早一些,例如在State.initState,State.didUpdateConfig或State.didChangeDependencies中。构造FutureBuilder时,不得在State.build或StatelessWidget.build方法调用期间创建它。如果Future是与FutureBuilder同时创建的,则每次FutureBuilder的父代重建时,异步任务都将重新启动。
因此,要防止其触发,您必须执行以下操作:
class _MyAppState extends State<MyApp> {
Future<String> _myString;
@override
void initState() {
super.initState();
_myString = _fetchString();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: _myString,
builder: (context, snapshot) {
// build page stuff...
},
),
);
}
}
Future<String> _fetchString() async {
print('running future function');
await Future.delayed(Duration(seconds: 3));
return 'potatoes';
}
请注意,要访问initState()中的提供程序,您必须将listen设置为false,如this答案中所述。
答案 2 :(得分:0)
如果您使用的是android studio,请尝试从终端运行,以解决此问题。运行按钮附加了调试服务,然后强制重新构建整个应用程序