如何从Flatter中的Firebase数据库中预加载抽屉信息?
我的应用程序中有一个抽屉,我需要让它显示当前用户的一些信息。我做到了,但是我需要的数据只在几秒钟后显示出来,因为获取它的函数在小部件中。 下面是一些代码:如何从Flatter中的Firebase数据库中预加载抽屉信息?,firebase,flutter,Firebase,Flutter,我的应用程序中有一个抽屉,我需要让它显示当前用户的一些信息。我做到了,但是我需要的数据只在几秒钟后显示出来,因为获取它的函数在小部件中。 下面是一些代码: class MainDrawer extends StatefulWidget { @override _MainDrawerState createState() => _MainDrawerState(); } class _MainDrawerState extends State<MainDrawer> {
class MainDrawer extends StatefulWidget {
@override
_MainDrawerState createState() => _MainDrawerState();
}
class _MainDrawerState extends State<MainDrawer> {
UserCore user = UserCore();
Future getUser() async {
var uid = await FirebaseAuth.instance.currentUser().then((val) {
return val.uid;
});
Firestore.instance
.collection("users")
.where("uid", isEqualTo: uid)
.getDocuments()
.then((val) {
user = UserCore.fromMap(val.documents[0]);
setState(() {});
});
}
@override
void initState() {
getUser();
super.initState();
}
@override
Widget build(BuildContext context) {
return Drawer(
child: Container(
alignment: Alignment.centerLeft,
color: Color.fromRGBO(59, 46, 46, 1),
child: ListView(
shrinkWrap: true,
scrollDirection: Axis.vertical,
//padding: EdgeInsets.zero,
children: <Widget>[
Column(
children: <Widget>[
DrawerHeader(
child: Image.asset(
"img/logo.png",
width: 100,
),
),
drawerInfo("User: ", user.info1 == "" ? user.info2: user.info1),
drawerInfo("Email: ", user.email),
],
),
class MainDrawer扩展StatefulWidget{
@凌驾
_MainDroperState createState()=>\u MainDroperState();
}
类_maindurerstate扩展状态{
UserCore user=UserCore();
Future getUser()异步{
var uid=wait FirebaseAuth.instance.currentUser()。然后((val){
返回val.uid;
});
Firestore.instance
.收集(“用户”)
。其中(“uid”,isEqualTo:uid)
.getDocuments()
.然后((val){
user=UserCore.fromMap(val.documents[0]);
setState((){});
});
}
@凌驾
void initState(){
getUser();
super.initState();
}
@凌驾
小部件构建(构建上下文){
回程抽屉(
子:容器(
对齐:alignment.centerLeft,
颜色:颜色。来自RGBO(59,46,46,1),
子:ListView(
收缩膜:对,
滚动方向:轴垂直,
//填充:EdgeInsets.zero,
儿童:[
纵队(
儿童:[
抽屉阅读器(
子:Image.asset(
“img/logo.png”,
宽度:100,
),
),
抽屉信息(“User:,User.info1==”?User.info2:User.info1),
抽屉信息(“电子邮件:”,user.Email),
],
),
这是代码的核心部分,我的最后一个问题是,当用户打开Firebase数据库时,如何使从Firebase数据库提交的数据停止突然出现在抽屉中,并且已经存在?
此抽屉存在于大多数应用程序中,因此将信息作为参数传递是不可行的。您正在从Firebase加载数据,这意味着数据可能必须来自网络,这将不可避免地需要时间。但有许多方法可以让用户更快地完成此操作:
因为在你的控制下,前两个选项不太可能,你唯一的一个“强>可以< /Stand >控件是你所请求的数据量。确保只请求你绝对需要显示的数据。你似乎已经这样做了,但是它<强> < /强>通常要考虑的事情。
Source:Source.serverAndCache
传递到缓存中,强制来自缓存。如果在那里得到结果,则将其显示给用户。如果没有得到结果,则仍必须从服务器请求我使用了
source:source.serverAndCache
,但似乎应用程序正在尝试首先从服务器获取数据。我如何使用实时侦听器修复此问题?很抱歉,我仍在学习后端。这就是为什么我说您应该使用两个独立的getDocuments()
调用或实时侦听器。实时侦听器基本上执行cachefirstandtenserver
类型操作。