初始化对象以显示在我的脚手架中

Posted

技术标签:

【中文标题】初始化对象以显示在我的脚手架中【英文标题】:Initialize object to show in my Scaffold 【发布时间】:2019-01-26 20:15:44 【问题描述】:

我正在开发一个 Flutter 应用,遇到一个问题就停下来了,希望你们能帮助我。

首先,英语不是我的第一语言,所以很抱歉有任何错别字。

我正在编写一个简单的“管理个人资料”屏幕。当用户在我的应用上注册时,我会向他展示一个 Scaffold,其中包含一些必须填写的字段,例如姓名、姓氏、电子邮件等。

我正在使用 Firestore 数据库,这就是我调用的异步方法来检索“用户”对象:

  Future<Usuario> getUsuarioLogado() async 
    Cartao cartao;
    String email = await auth.currentUser();
    String nome, sobrenome, cpf, numeroCartao, nomeCartao;

    DocumentReference usuarioReference =
        Firestore.instance.document('Usuarios/' + email);

    usuarioReference.get().then((datasnapshot) 
      if (datasnapshot.exists) 
        nome = datasnapshot.data['nome'];
        sobrenome = datasnapshot.data['sobrenome'];
        cpf = datasnapshot.data['cpf'];

        CollectionReference cartaoReference =
            Firestore.instance.collection('Usuarios/' + email + '/Cartao');

        cartaoReference.getDocuments().then((cartoes) 
          List listCartoes = cartoes.documents;
          nomeCartao = listCartoes[0].data['nome'];
          numeroCartao = listCartoes[0].data['numero'];

          cartao = new Cartao(nomeCartao, numeroCartao);
          return new Usuario(cpf, nome, sobrenome, email, cartao);
        ).catchError((e) 
          print('#ANTLOG_GET_CARTAO: ' + e);
        );
      
      return new Usuario(cpf, nome, sobrenome, email, cartao);
    ).catchError((e) 
      print('#ANTLOG_GET_USUARIO: ' + e);
    );
  

上面的代码在我调试时工作,但在我需要时它不返回对象。现在是我的屏幕正在构建自己的时刻。

在阅读了一些论坛后,我尝试返回一个 FutureBuilder,它只会在“Usuarios”(用户)不为空时显示内容。

return FutureBuilder<Usuario>(
  future: perfil.getUsuarioLogado(),
  builder: (BuildContext context, AsyncSnapshot<Usuario> snapshot) 
    if (snapshot.connectionState == ConnectionState.done) 
      print('#ANTLOG: $snapshot.data');
      return scaffold;
     else
      return Text('Loading...');
  ,
);

下面的代码给我一个空值:

print('#ANTLOG: $snapshot.data');

我想知道如何强制屏幕等到我拥有我的“Usuarios”对象。似乎 FutureBuilder 不工作或者我做错了什么。

我需要你的帮助。

【问题讨论】:

尝试使用snapshot.connectionState == done 代替snapshot.hasData @RémiRousselet,现在屏幕总是在Loading... 屏幕中 您的加载很可能有错误。因此hasData 总是假的 我的快照有时会检索数据,但调用了return 方法并且它没有数据。我可以添加一些侦听器来获取快照对象,以便我可以使用检索到的数据重新加载我的 Scaffold 吗? 【参考方案1】:

FutureBuilder 有一个名为initialData 的属性,您可以使用它来放置您的初始空对象。

正如 Rémi Rousselet 提到的,您应该使用 snapshot.hasData 检查是否有可用数据

 if (snapshot.hasData) 
      print('#ANTLOG: $snapshot.data');
      return scaffold;
     else
      return Text('Loading...');
  ,

因为你的方法被标记为async,所以在usuarioReference.get()之前使用await关键字等待响应,这样你的代码将更具可读性。

 await usuarioReference.get()  ...

同样的

 await cartaoReference.getDocuments()

【讨论】:

我不能在 FutureBuilder 的 Future 参数中使用 await 导致 Dart 抛出错误。 最终数据快照 = 等待 usuarioReference.get(); //在你的方法中而不是使用 then()... final 关键字并不重要,只是 await (FutureTask) ,而不是 (FutureTask).then .... 你可以使用:var snapshot = await usuarioReference.get();它会工作 没问题,尽可能观看此视频,您将了解有关 dart 中异步的更多信息:youtube.com/watch?v=MUDOIAssBDs

以上是关于初始化对象以显示在我的脚手架中的主要内容,如果未能解决你的问题,请参考以下文章

在脚手架视图中显示域瞬态属性

Rails 脚手架黑色背景

Rails 3:脚手架销毁动作重定向以显示动作

Flutter 中从底部工作表到全屏脚手架

Rails 用户对电影的评论

如何在 Flutter 中显示 SnackBar?