Flutter-如何在flutter的整个应用程序生命周期中将数据保存在内存中?
Posted
技术标签:
【中文标题】Flutter-如何在flutter的整个应用程序生命周期中将数据保存在内存中?【英文标题】:Flutter- How to hold data in memory throughout app lifetime in flutter? 【发布时间】:2019-06-14 13:03:43 【问题描述】:我想知道如何保存我在多个屏幕中使用的数据。我们应该在 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 类中保存数据?
【问题讨论】:
你可以使用 shared_preferences 或 sqflite 包 我认为shared_preferences是存储用户偏好的。不建议在控制器之间传递数据。关于 sqflite,是的,这是一个选项,但是应用程序会持续请求不同的屏幕,然后应用程序需要获取用户(在这种情况下),在其他情况下,它可能是我希望共享的项目数组。我担心的是,在这种情况下,flutter 如何推荐数据处理。 【参考方案1】:我认为使用单例或仅使用静态数据将是不错的选择。不会更改的本地数据不应存储在状态管理中。当今移动开发中最大的问题之一是开发人员错误地使用了状态管理。它不仅仅用于存储数据,也不应该以这种方式使用。
【讨论】:
【参考方案2】:最好将数据存储在缓存中,以便随时随地在应用程序中获取数据。对于那个 shared_preferences 包很好,但它并不快,因为它使用本机代码来获取 shared_preference 实例。最好使用 Hive
而不是 shared_preferences,因为它更快、更安全、用纯 dart 编写且易于设置。
【讨论】:
【参考方案3】:您可以使用 shared_preferences, 包装 NSUserDefaults(在 ios 上)和 SharedPreferences(在 android 上),为简单数据提供持久存储。数据异步保存到磁盘。两个平台都不能保证写入返回后会持久化到磁盘,并且该插件不得用于存储关键数据。 shared_preferences
【讨论】:
以上是关于Flutter-如何在flutter的整个应用程序生命周期中将数据保存在内存中?的主要内容,如果未能解决你的问题,请参考以下文章
如何在android studio或vscode中搜索整个Flutter源码