我是Flutter的初学者,目前在Flutter中正确实现FutureBuilder时遇到问题。
我正在尝试建立一个用户页面,我的用户信息存储在Firebase中,每次访问该用户页面时,它都会检索当前用户数据并在页面上显示数据。这是我为实现编写的代码:
class UserPage extends StatefulWidget{
@override
UserPageState createState() => UserPageState();
}
class UserPageState extends State<UserPage>{
String userName;
String userEmail;
String collegeName;
Future _infoInit() async {
userName = await HelperFunctions.getUserNamePreference();
userEmail = await HelperFunctions.getUserEmailPreference();
collegeName = await HelperFunctions.getUserCollegePreference();
}
Widget userScaffold(BuildContext context, AsyncSnapshot snapshot){
return Scaffold(
appBar: AppBar(
elevation: 0,
title: Text(
userName
),
backgroundColor: Colors.lightBlue,
),
body:Center(
child: Text("This is User Page")
)
);
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _infoInit(),
builder: (context,AsyncSnapshot snapshot) => userScaffold(context, snapshot)
);
}
}
目前,我编写的唯一部分是在应用程序栏上显示当前登录的用户,并且当我运行代码时,它似乎已成功运行。但是,当我查看android studio控制台时,我可以看到它实际上正面临着错误,我认为这与在FutureBuilder小部件中执行的异步功能有关。
Error Message:
Performing hot reload...
Syncing files to device iPhone 11...
Reloaded 7 of 650 libraries in 397ms.
════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following assertion was thrown building FutureBuilder<dynamic>(dirty, state: _FutureBuilderState<dynamic>#772f1):
A non-null String must be provided to a Text widget.
'package:flutter/src/widgets/text.dart':
Failed assertion: line 298 pos 10: 'data != null'
The relevant error-causing widget was:
FutureBuilder<dynamic> file:///Users/nossu3751/Downloads/flutter_project/moim_app/lib/user/profile.dart:39:12
When the exception was thrown, this was the stack:
#2 new Text (package:flutter/src/widgets/text.dart:298:10)
#3 UserPageState.userScaffold (package:moimapp/user/profile.dart:26:18)
#4 UserPageState.build.<anonymous closure> (package:moimapp/user/profile.dart:41:54)
#5 _FutureBuilderState.build (package:flutter/src/widgets/async.dart:732:55)
#6 StatefulElement.build (package:flutter/src/widgets/framework.dart:4619:28)
更确切地说,它表示我要在FutureBuilder中使用的userName为null,即使我相信我已经通过运行_infoInit()方法分配了该值,并且实际上确实在模拟器上正确显示了该值。
如果有人可以让我知道我在这里做错了什么,以及我可以做些什么来阻止此消息再次出现,我将不胜感激。提前非常感谢您!
最佳答案
您需要在构建器中使用ConnectionState。查看以下代码模板:(当前,您的构建器返回userScaffold,而无需等待将来完成)
return FutureBuilder(
future: yourFuture(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
// future complete
// if error or data is false return error widget
if (snapshot.hasError) {
return _buildErrorWidget('SOMETHING WENT WRONG, TAP TO RELOAD');
}
// return data widget
return _buildDataWidget();
// return loading widget while connection state is active
} else
return _buildLoadingWidget();
},
);
关于firebase - Flutter FutureBuilder会引发错误,但在仿真中它会按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62444037/