gpt4 book ai didi

http - Flutter:如何从 http 请求创建单例

转载 作者:IT王子 更新时间:2023-10-29 07:00:20 27 4
gpt4 key购买 nike

我想声明一个用户对象,我将用一个 http 请求实例化它,并且我希望它是全局的。我该怎么做?与单例?但是我怎样才能让这个类(class)也成为单例呢?或者还有其他方法吗?这就是我到目前为止所做的:

class User{
String username;
String password;
int id;

User({this.username, this.id});

factory User.fromJson(Map<String, dynamic> json){
return User(
username: json['name'],
id: json['id']
);
}

}

然后:

var user = await login(username, password, context);

最佳答案

在flutter中,你不应该制作单例。相反,您应该将它存储到一个小部件中,该小部件将这些数据公开给它的所有后代。通常是InheritedWidget

原因是,有了这样的架构,所有后代都会自动意识到对您的“单例”所做的任何更改。

一个典型的例子如下:

@immutable
class User {
final String name;

User({this.name});
}

class Authentificator extends StatefulWidget {
static User currentUser(BuildContext context) {
final _AuthentificatorScope scope = context.inheritFromWidgetOfExactType(_AuthentificatorScope);
return scope.user;
}

final Widget child;

Authentificator({this.child, Key key}): super(key: key);

@override
_AuthentificatorState createState() => _AuthentificatorState();
}

class _AuthentificatorState extends State<Authentificator> {
@override
Widget build(BuildContext context) {
return _AuthentificatorScope(
child: widget.child,
);
}
}

class _AuthentificatorScope extends InheritedWidget {
final User user;

_AuthentificatorScope({this.user, Widget child, Key key}) : super(child: child, key: key);

@override
bool updateShouldNotify(_AuthentificatorScope oldWidget) {
return user != oldWidget.user;
}
}

你必须像这样实例化:

new MaterialApp(
title: 'Flutter Demo',
builder: (context, child) {
return Authentificator(
child: child,
);
},
home: Home(),
);

然后像这样在你的页面中使用:

@override
Widget build(BuildContext context) {
User user = Authentificator.currentUser(context);
...
}

关于http - Flutter:如何从 http 请求创建单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52077970/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com