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的整个应用程序生命周期中将数据保存在内存中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中更改整个主题的文本颜色?

Flutter中实现整个App变为灰色

如何在android studio或vscode中搜索整个Flutter源码

Flutter - 如何让带有孩子的容器占据整个屏幕

如何在 Flutter 中让 ListView 中的项目覆盖整个屏幕

如何在 Flutter 中拉伸图像以适合整个背景(100% 高度 x 100% 宽度)?