在使用配置单元的Flutter中,如何将自定义对象从响应后主体添加到框中?

o4hqfura  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(266)

我想在一个配置单元框中存储一个用户对象。成功发布后,我返回一个user对象,hive不会将其添加到框中,因为它不是我编写的hivetype模型(hiveuser)。有没有办法解决这个问题,或者我可以将我的用户对象转换为我专门为向框中添加用户而编写的hiveuser对象?下面是一些片段来给出一个想法
在这里,我调用post的函数并返回user对象

onPressed: () async {
                          User user;
                          try {
                            user = await loginUser(passwordController.text, nameController.text);
                          } on Exception {
                            print(Text("Exception has occurred during login"));
                          }

                          // print(nameController.text);
                          if(user.success) {
                            addUser(user);

将用户添加到框中的函数。我需要这个来使用hiveuser对象来成功添加它。但是用户作为普通用户对象从post响应主体进入。

void addUser(User user) {
  // I need a HiveUser user here.
  final userBox = Hive.box('user');
  userBox.add(user);
}

最初使用的用户模型。

class User {
bool success;
String userID;
String firstName;
String lastName;

  User({this.success, this.userID, this.firstName, this.lastName});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      success: json['success'],
      userID: json['UserID'],
      firstName: json['FirstName'],
      lastName: json['LastName'],

    );
  }
}
uqdfh47h

uqdfh47h1#

我不知道您是否熟悉设计模式,但在这种情况下,您需要一个中间层来完成数据库/api和模型(user和hiveuser)之间的数据转换,或者一个工厂构造函数来完成
例如这样的方法

@HiveType(typeId: 0)
class HiveUser{
  @HiveField(0)
  String name;

  @HiveField(1)
  String lastName;

  @HiveField(2)
  int age;

  @HiveField(3)
  String gender;

  HiveUser({this.name, this.lastName, this.gender, this.age});

  //just like you would decode a json into a model
  factory HiveUser.fromUser(User user){
     return HiveUser(
        name: user.name
        lastName: user.lastName
        gender: user.gender,
        age: user.age
     );
  }
}

在adduser中

void addUser(User user) {
  // I need a HiveUser user here.
  final userBox = Hive.box('user');
  userBox.add(HiveUser.fromUser(user));
}

最好有一个中间层来做这件事,而不是修改模型类(例如dao)以将逻辑保持在hive模型之外,但这应该能让您看到您可以做什么

相关问题