5

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

假设我使用 BLoC 模式制作了登录模块,例如https://github.com/adamjohnlea/Flutter-Login-With-BLoC-Pattern

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

提供者代码:

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,我将在哪里存储用户详细信息并在需要的地方获取详细信息?还是我应该使用下面的 Provider 在应用程序的任何地方获取电子邮件和密码?

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

4

3 回答 3

0

我认为使用单例或仅使用静态数据将是不错的选择。不会更改的本地数据不应存储在状态管理中。当今移动开发中最大的问题之一是开发人员错误地使用状态管理。它不仅仅用于存储数据,也不应该以这种方式使用。

于 2021-11-18T15:31:43.157 回答
0

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

于 2020-12-17T07:02:20.173 回答
0

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

于 2019-01-21T09:22:13.227 回答