在 Flutter 应用中使用 Stream 填充 TextEditingController

问题描述

我似乎无法在不丢失快照的情况下将 QuerySnapshot 从一个类传递到另一个类,因此我试图找到解决方法 (see my post here)。我正在尝试使用 StreamBuilder 再次提取数据。

StreamBuilder (
        stream: _db.collection('agency').doc(globals.agencyId).
        collection('trxns').doc(globals.currentTrxnId).snapshots(),builder: (context,trxnSnapshot) {  <<<< ERROR 1
        if (trxnSnapshot.hasData) {
          var outPut = trxnSnapshot.data();  <<<< ERROR 2
          clientFNameController.text = trxnSnapshot.data.data['clientFName'] ?? ""; <<<< ERROR 3
        }
)

我遇到了一些错误

  1. 主体可能正常完成,导致返回 'null',但返回类型可能是不可为 null 的类型。 我试过添加“?”和 ”!”但它不起作用。

  2. 在帖子中找到了这行代码,但我不确定如何从快照中获取数据。

  3. 错误将在 #2 修复后修复。

这些应该很容易解决,但我不知道该怎么做。

编辑我尝试添加如下所示的类型转换,但出现新错误

StreamBuilder<QuerySnapshot> (
        stream: _db.collection('agency').doc(globals.agencyId).
        collection('trxns').doc(globals.currentTrxnId).snapshots(),trxnSnapshot) {
          if (trxnSnapshot.hasData) {
            var outPut = (trxnSnapshot.data() as QueryDocumentSnapshot);
                        clientFNameController.text = trxnSnapshot.data.data['clientFName'] ?? "";
          }
)

enter image description here

解决方法

您应该首先检查您收到的快照是否有任何数据。如果没有,就不可能调用 trxnSnapshot.data()

试试这个:

StreamBuilder (
        stream: _db.collection('agency').doc(globals.agencyId).
        collection('trxns').doc(globals.currentTrxnId).snapshots(),builder: (context,trxnSnapshot) {
          if(trxnSnapshot.hasData){  
            var outPut = trxnSnapshot.data();  
            clientFNameController.text = trxnSnapshot.data.data['clientFName'] ?? "";
       } else {
            print("Do something,maybe show a loading widget");
    }
          
)