【问题标题】:Realtime Update of UI with StreamBuilder and bool -ERROR Expected a value of type 'Map<dynamic, dynamic>', but got one of type '_JsonDocumentSnapshot'使用 StreamBuilder 和 bool 实时更新 UI -ERROR 预期类型为 \'Map<dynamic, dynamic>\',但得到类型为 \'_JsonDocumentSnapshot\' 的值之一
【发布时间】:2022-10-08 20:37:23
【问题描述】:

在标题中,我解释了我想做什么。我有一个名为的布尔值 'turnInvitingPlayer' 存储在 Firestore 的文档字段中的某处。我从 GameTable 的实例变量中确切知道文档的位置。

这是我尝试过的:

class GameTable extends StatefulWidget {
  GameTable({Key? key,
    required this.player,
    required this.invitationID,
    required this.invitationIdPlayerInvited,
    required this.invitationIdPlayerInviting})
      : super(key: key);
  final Player? player;
  final String invitationIdPlayerInvited;
  final String invitationIdPlayerInviting;

  /// the invitation ID is the doc name of the gambling Table
  final String invitationID;

  @override
  State<GameTable> createState() => _GameTableState();
}

class _GameTableState extends State<GameTable> {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: FirebaseFirestore.instance
            .collection('GameTables')
            .doc(widget.invitationID)
            .snapshots(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            var dataGameTable = snapshot.data! as Map;
            var turnInvitingPlayer =
            dataGameTable['turnInvitingPlayer'] as bool;
            if (turnInvitingPlayer == true) {
              return Container(color: Colors.blue);
            } else {
              return Container(color: Colors.red);
            }
          } else if (!snapshot.hasData) {
            return Container(
              child: Text('There is no data'),
            );
          }
          return CircularProgressIndicator();
        });
  }
}

运行应用程序时出现以下错误 Expected a value of type 'Map&lt;dynamic, dynamic&gt;', but got one of type '_JsonDocumentSnapshot' 有人可以告诉我如何简单地访问流的布尔值并在 if 子句中使用它吗?

感谢所有愿意提供帮助的人。

【问题讨论】:

  • 而不是snapshot.data!,请尝试snapshot.data!.data()

标签: flutter firebase dart firebase-realtime-database


【解决方案1】:

如下修改您的流构建器:

return StreamBuilder<Map<dynamic,dynamic>>(
    stream: FirebaseFirestore.instance
        .collection('GameTables')
        .doc(widget.invitationID)
        .snapshots(),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        var dataGameTable = snapshot.data! as Map;
        var turnInvitingPlayer =
        dataGameTable['turnInvitingPlayer'] as bool;
        if (turnInvitingPlayer == true) {
          return Container(color: Colors.blue);
        } else {
          return Container(color: Colors.red);
        }
      } else if (!snapshot.hasData) {
        return Container(
          child: Text('There is no data'),
        );
      }
      return CircularProgressIndicator();
    });

【讨论】:

    【解决方案2】:

    我找到了解决方案,我做了以下更改:

    var dataGameTable = snapshot.data!; // remove as Map
    var turnInvitingPlayer = dataGameTable['turnInvitingPlayer'] as bool; // remove this line
    

    现在我可以使用简单的dataGameTable['turnInvitingPlayer'] 访问布尔值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 2021-11-15
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2021-11-04
      • 2021-10-30
      • 2023-01-02
      相关资源
      最近更新 更多