【问题标题】:How to save correctly data into my model from an StreamBuilder如何从 StreamBuilder 将数据正确保存到我的模型中
【发布时间】:2021-10-03 03:28:08
【问题描述】:

所以我想知道将数据保存到我的模型中的最佳方法是什么。我注意到关于 StreamBuilder 和 Models 的信息并不多。 (我的意思是两者一起)。

这是我目前的模型。

class User {
  String _username, _name, _dateBorn, _gender;

  bool _isObserver, _notifyFriends, _recordAudio, _sendTweet;

  List<dynamic> _friendList;
  List<dynamic> _pendingFriends;

  User(
      this._username,
      this._name,
      this._dateBorn,
      this._gender,
      this._isObserver,
      this._notifyFriends,
      this._recordAudio,
      this._sendTweet,
      this._friendList,
      this._pendingFriends);

  String get username => _username;
  String get name => _name;
  String get dateBorn => _dateBorn;
  String get gender => _gender;

  bool get isObserver => _isObserver;
  bool get notifyFriends => _notifyFriends;
  bool get recordAudio => _recordAudio;
  bool get sendTweet => _sendTweet;

  set setNotifyFriends(bool value) => _notifyFriends = value;
  set setRecordAudio(bool value) => _recordAudio = value;
  set setSendTweet(bool value) => _sendTweet = value;

  List<dynamic> get friendList => _friendList;
  List<dynamic> get pendinFriends => _pendingFriends;
}

这是我当前的 FireStore 数据库。

我现在正在做的就是这个。

StreamBuilder(
            stream:
                FirebaseFirestore.instance.collection('Usuarios').snapshots(),
            builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
              if (!snapshot.hasData) {
                return Center(
                  child: CircularProgressIndicator(),
                );
              }

              var data = snapshot.data!.docs;
              var user;

              data.forEach((element) {
                if (element["username"] == me) {
                  user = User(
                    element["username"],
                    element["realName"],
                    element["date_birth"],
                    element["sexo"],
                    element["isObserver"],
                    element["config"]["notifyFriends"],
                    element["config"]["recordAudio"],
                    element["config"]["sendTweet"],
                    element["friends"],
                    element["pendingFriends"],
                  );
                }
              });

              return FriendsWidget(user);
            }),

但我很确定这不是一个好的做法,将数据提供给模型的最佳做法是什么?不丢失实时更新数据功能?

谢谢!

【问题讨论】:

    标签: flutter dart model stream


    【解决方案1】:

    我们可以使用json_serializable 包 Flutter 以简化 JSON 解析并将其分配给相应的模型 类而不是手动分配它。

    您可以创建方法fromJsontoJson 来解析JSONObjects。但是,我们可能需要设置一些开发依赖项以使其在我们的项目中工作。请参考Flutter的文档

    用法很简单,如下所示

    FirebaseFirestore.instance.collection('allUsers').snapshots().listen((event) {
        for (var element in event.docChanges) {
            final modelData = UserModel.fromJson(element.doc.data());
            // Do anything with your user. For example adding to list. 
        }
    });
    

    模型类

    part 'user_model.g.dart';
    
    @JsonSerializable()
    class UserModel {
      @JsonKey(name: 'user_id')
      String userId;
    
      @JsonKey(name: 'name')
      String name;
      
      UserModel();
    
      factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json);
    
      Map<String, dynamic> toJson() => _$UserModelToJson(this);
    }
    

    json_serializablefirestore 的用法在以下文章中进行了说明。可以作为参考。

    firestore-with-flutter-json-annotation

    flutter-using-json_serializable-to-serialise

    https://livebook.manning.com/book/flutter-in-action/chapter-10/v-7/54

    详细信息在示例链接中以零碎的形式提供。您可能需要对其进行调整以最适合您的要求。

    【讨论】:

    • 除了上面的答案,还可以利用map()函数
    • 您好!谢谢你们的回复,我很抱歉,但我对颤振/飞镖很新,我应该将QueryDocumentSnapshot 转换为json object?我想知道您是否可以举一个将data 变量转换为json object 并将其放入模型的示例。提前致谢
    • 添加了一些示例链接和代码sn-p。
    • 非常感谢这些参考,以及代码 sn-p!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2013-06-11
    • 2012-01-22
    • 2017-10-11
    • 1970-01-01
    • 2012-08-25
    相关资源
    最近更新 更多