我想声明一个用户对象,该对象将用一个http请求实例化,并且希望它是全局的。我该怎么做?有单身人士吗?但是,如何使该课程也成为Singleton?还是有另一种方法? 到目前为止,这就是我所做的:
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);
答案 0 :(得分:1)
在扑打中,您不应该单身。相反,您应该将其存储在将这些数据公开给其所有后代的小部件中。
通常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);
...
}