flutter - 使用代表登录用户的全局用户实例是否很好?
问题描述
我正在创建一个具有登录和注销功能的生产应用程序。现在,我正在使用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
用于获取登录用户。
解决方案
推荐阅读
- r - 标签太长,无法放入条形区域
- sql - 插入第一个表后如何使用一些相同的信息自动更新第二个表
- loopbackjs - 使用提供者在拦截器中传递自定义参数
- javascript - 创建自定义输入字段
- svg - SVG feImage 过滤器剪辑中风 - 如何阻止它?
- javascript - 如果满足条件,则在 JavaScript 中合并数组中的对象
- botframework - 如何添加一个可以关闭网络聊天页面的按钮?
- ruby-on-rails - Rails webpacker 正在加载以前删除的控制器
- datagrid - 如何在 WPF DataGrid 中禁用 CTRL 键盘
- php - 如何使用 PHP 更改 Excel 单元格日期