首页 > 解决方案 > 使用代表登录用户的全局用户实例是否很好?

问题描述

我正在创建一个具有登录和注销功能的生产应用程序。现在,我正在使用locator包和注册User实例作为单例。

final Locator locator = locator.instance;

void setupLocator() {
    locator.registerSingleton(User());
}

在用户类中,有两种方法,一是更新用户信息,二是判断用户是否登录。请记住,我没有使用 firebase 身份验证。我只是将用户存储在本地存储中,并在用户提供有效凭据时检索它。

在渲染登录页面之前,全局用户实例包含值,表示用户未登录。我可以通过调用全局实例上的函数null来确定用户是否登录。isValid()

当用户名和密码与本地存储的用户对象匹配时,我通过updateUser()使用从本地存储中检索到的正确信息调用函数来更新用户的全局实例。

import "package:json_annotation/json_annotation.dart";

part "user.g.dart";

@JsonSerializable()
class User {
  String? _id;
  String? _username;
  String? _name;
  String? _email;
  String? _password;

  User(
      {String? id,
      String? name,
      String? username,
      String? email,
      String? password})
      : _id = id,
        _name = name,
        _username = username,
        _email = email,
        _password = password;

  factory User.fromMap(Map<String, dynamic> map) => _$UserFromJson(map);
  Map<String, dynamic> toMap() => _$UserToJson(this);

  String? get id => _id;
  String? get username => _username;
  String? get name => _name;
  String? get email => _email;
  String? get password => _password;

  void updateFromUser(User user) {
    _id = user.id;
    _email = user.email;
    _name = user.name;
    _username = user.username;
    _password = user.password;
  }

  bool isValid() {
    return _id != null &&
        _username != null &&
        _name != null &&
        _email != null &&
        _password != null;
  }

  @override
  String toString() {
    return "User { id: $_id, name: $_name, username: $_username, email: $email, password: null }";
  }
}

在无状态小部件中,我通过访问用户全局实例locator并使用它来呈现个人资料页面。

class Home extends StatelessWidget {
  final User user = locator<User>();

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Text(
          user.name!,
          style: TextStyle(fontSize: 12),
        ),
      ),
    );
  }
}

我想我告诉了有关代码的一切。现在我的问题是,这是一种更好的方法还是我可以做得更好?

我正在考虑riverpod将来使用并Provider用于获取登录用户。

标签: flutter

解决方案


推荐阅读