如何从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 >控件是你所请求的数据量。确保只请求你绝对需要显示的数据。你似乎已经这样做了,但是它<强> < /强>通常要考虑的事情。

  • 本地缓存数据,然后从那里重新加载。Firestore会自动将接收到的任何数据存储在本地设备上的磁盘缓存中,并可以在应用程序再次请求时从那里加载数据。但您当前加载用户文档的方式会绕过该缓存,并强制服务器响应该请求

    有两种方法可以解决此问题:

  • 通过将
    Source:Source.serverAndCache
    传递到缓存中,强制来自缓存。如果在那里得到结果,则将其显示给用户。如果没有得到结果,则仍必须从服务器请求

  • 使用,它首先从缓存返回文档,然后检查服务器是否有更新,并在有任何更新时再次调用代码。这意味着用户可以立即看到本地缓存的版本,然后可能会在几分钟后看到更新


  • 我使用了
    source:source.serverAndCache
    ,但似乎应用程序正在尝试首先从服务器获取数据。我如何使用实时侦听器修复此问题?很抱歉,我仍在学习后端。这就是为什么我说您应该使用两个独立的
    getDocuments()
    调用或实时侦听器。实时侦听器基本上执行
    cachefirstandtenserver
    类型操作。