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

时间:2018-08-29 12:53:06

标签: http dart flutter

我想声明一个用户对象,该对象将用一个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);

1 个答案:

答案 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);
  ...
}