Flutter-如何在整个应用程序生命周期中将数据保存在内存中?

时间:2019-01-21 07:03:30

标签: design-patterns login flutter bloc

我想知道如何保存我在多个屏幕中使用的数据。我们应该在扑打中使用Singleton设计模式吗?

假设我使用https://github.com/adamjohnlea/Flutter-Login-With-BLoC-Pattern这样的BLoC模式制作了登录模块。

现在,如果对于服务器的每个请求,我都需要发送电子邮件和密码。

提供者代码:

import 'package:flutter/material.dart';
import 'bloc.dart';

class Provider extends InheritedWidget {

  final bloc = new Bloc();

  Provider({Key key, Widget child})
    : super(key: key, child: child);

  bool updateShouldNotify(_) => true;

  static Bloc of(BuildContext context) {
    return (context.inheritFromWidgetOfExactType(Provider) as Provider).bloc;
  }

}

集团代码:

import 'validators.dart';
import 'package:rxdart/rxdart.dart';

class Bloc extends Object with Validators {
  final _email = BehaviorSubject<String>();
  final _password = BehaviorSubject<String>();

  // retrieve data from stream
  Stream<String> get email    => _email.stream.transform(validateEmail);
  Stream<String> get password => _password.stream.transform(validatePassword);
  Stream<bool>   get submitValid => Observable.combineLatest2(email, password, (e, p) => true);

  // add data to stream
  Function(String) get changeEmail    => _email.sink.add;
  Function(String) get changePassword => _password.sink.add;

  submit() {
    final validEmail    = _email.value;
    final validPassword = _password.value;

    print('$validEmail and $validPassword');
  }

  dispose() {
    _email.close();
    _password.close();
  }
}

1。我应该做单例课程吗? AccountManager,我将在其中存储用户详细信息并在需要的任何地方获取详细信息?还是我应该使用提供者下方的名称来获取应用程序中任意位置的电子邮件和密码?

2。是否建议将数据保存在Singleton类中?

2 个答案:

答案 0 :(得分:0)

您可以使用shared_preferences, 包装NSUserDefaults(在iOS上)和SharedPreferences(在Android上),为简单数据提供持久存储。数据异步保存到磁盘。这两个平台都不能保证在返回后将写操作持久化到磁盘,并且该插件不得用于存储关键数据。 shared_preferences

答案 1 :(得分:0)

最好将数据存储在缓存中,以便随时随地在应用程序中获取数据。对于那个shared_preferences包来说是好的,但是它并不快,因为它使用本机代码来获取shared_preference实例。最好使用Hive而不是shared_preferences,因为它更快,更安全,使用纯飞镖编写并且易于设置。