【问题标题】:Flutter/Dart - Passing/setting variable outside a Firestore docref.get().then() { ??? }Flutter/Dart - 在 Firestore docref.get().then() { ??? 之外传递/设置变量}
【发布时间】:2019-05-17 22:21:14
【问题描述】:

我有一个简单的 Flutter 应用程序,它将由管道字符分隔的字符串值...恰好是歌曲名称(即:'Rudolf|Jingle Bells|White Christmas')到 ListView...其中歌曲名称是 ListTiles .关于我为什么要这样做的长篇大论……请多多包涵。我有一个名为“sets”的 Firestore 集合,在集合中我有一个带有 SET01 键的文档。然后在 SET01 中,我有一个名为“歌曲”的字段......一个包含由管道分隔的歌曲的文本字段。我调用 getSetList() 从 Firestore 检索文本字段。我似乎可以在 set01DocRef.get().then((snapshot)....

中获得“歌曲”的值

但我似乎无法将该值从 .then() 传递并返回给函数以将其传递回调用小部件。

非常感谢任何帮助。

String getSetList () {

String songList = 'Loading.....';
DocumentReference set01DocRef = Firestore.instance.collection('sets').document('SET01');

set01DocRef.get().then((snapshot){
  print('String songList inside .then() before assignment:  ' + songList);     //Wagon Wheel|Her Diamonds|Waterfalls
  print('Snapshot value of songs:  ' + snapshot['songs']);         //Wagon Wheel|Her Diamonds|Waterfalls
  songList = snapshot['songs'];     
  print('String songList inside .then() after assignment:  ' + songList);     //Wagon Wheel|Her Diamonds|Waterfalls
});

print('Bueller? Bueller??');
print('String songList outside of .then():  ' + songList);                  

return songList;
}

输出:

flutter: Bueller? Bueller??
flutter: String songList outside of .then():  Loading.....
Reloaded 0 of 424 libraries in 442ms.
flutter: String songList inside .then() before assignment:  Loading.....
flutter: Snapshot value of songs:  Wagon Wheel|Her Diamonds|Waterfalls
flutter: String songList inside .then() after assignment:  Wagon Wheel|Her Diamonds|Waterfalls

**该函数直接跳过 .get() 并立即返回...我知道这可能与强制系统等待该值从 FS 返回有关...但我没有不知道怎么处理。

【问题讨论】:

    标签: dart flutter google-cloud-firestore


    【解决方案1】:

    这是 then() 块的预期行为:一旦加载数据,该块内的代码将被异步调用,因此需要数据的调用代码必须位于 then() 块内。

    幸运的是,Dart 有一个 await 关键字可以让这更容易。它基本上取代了then() 块:

    Future<String> getSetList () async {
      String songList = 'Loading.....';
      DocumentReference set01DocRef = 
      Firestore.instance.collection('sets').document('SET01');
    
      snapshot = await set01DocRef.get();
      print('String songList inside .then() before assignment:  ' + songList);     
      //Wagon Wheel|Her Diamonds|Waterfalls
      print('Snapshot value of songs:  ' + snapshot['songs']);         //Wagon 
      Wheel|Her Diamonds|Waterfalls
      songList = snapshot['songs'];     
      print('String songList inside .then() after assignment:  ' + songList);     
      //Wagon Wheel|Her Diamonds|Waterfalls
    
      print('Bueller? Bueller??');
      print('String songList outside of .then():  ' + songList);  
      return songList;
    }
    

    请注意,任何对getSetList() 的调用现在也必须使用await

    var setlist = await getSetList();
    

    【讨论】:

    • 非常感谢您的快速回复...对不起,如果我知道这应该如何工作...但我尝试了以下行:snapshot = await set01DocRef.get();并且没有定义快照...将其更改为 var snapshot = await set01DocRef.get();并且等待显示错误“意外的文本等待”再次感谢您的帮助。
    • 我忘记将该方法标记为异步。现在添加了。有关这方面的更多信息,请参阅 pub.dartlang.org/packages/cloud_firestoredartlang.org/tutorials/language/futures
    • 再次感谢...我想我已经很接近了。我发现需要“异步”,但后来它希望我的 String getSetList() 成为 Future getSetList() ...所以我最终得到: Future getSetList () async {...} 这给了我的字符串值。但是当我尝试使用以下方法调用它时: var setList = await getSetList(); ...我开始再次出现“等待”错误...我将阅读下面的文档...如果有什么明显的关于我需要如何称呼它的信息,请告诉我。谢谢!!
    • 我不确定 Stack Overflow 上的最佳实践……但我会接受这个答案,因为它引导我找到答案……并用我更新的代码发布新帖子以及当前对问题的理解。
    • 我真的要亲自试一试。我的回答是基于以前使用 Firebase 身份验证的经验,我想了解它如何与 Firestore 一起工作(到目前为止我只做过流式传输)。
    猜你喜欢
    • 2021-11-01
    • 2019-07-25
    • 1970-01-01
    • 2021-07-20
    • 2022-01-23
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多