何时在 Flutter 中持久化数据(等效于 onPause)

Posted

技术标签:

【中文标题】何时在 Flutter 中持久化数据(等效于 onPause)【英文标题】:When to persist data in Flutter (onPause equivalent) 【发布时间】:2021-05-21 01:58:17 【问题描述】:

我正在编写一个面向移动设备的 Flutter 应用。我已经习惯了 android 范例,您可以在 onPause 中保留用户所做的所有更改,这基本上是在当前屏幕进入后台时调用的。我找不到 Flutter 等价物。

我看到的所有示例都有一个“提交”按钮,但我希​​望应用程序在我按下返回或主页按钮(或者如果我按下应用程序栏中的保存图标)时保存数据。

Flutter 应用程序通常在哪里将状态保存到存储中?

【问题讨论】:

【参考方案1】:

您可以使用WidgetsBindingObserver 获取AppLifecycleState.paused

class MyPage extends StatefulWidget 
  @override
  _MyPageState createState() => _MyPageState();


class _MyPageState extends State<MyPage> with WidgetsBindingObserver 
  @override
  void initState() 
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  

  @override
  void dispose() 
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) 
    super.didChangeAppLifecycleState(state);
    switch (state) 
      case AppLifecycleState.resumed:
        break;
      case AppLifecycleState.inactive:
        break;
      case AppLifecycleState.paused:
        _saveState();
        break;
      case AppLifecycleState.detached:
        break;
    
  

  void _saveState() 
    // Save state here
  

  @override
  Widget build(BuildContext context) => Scaffold(
        body: WillPopScope(
          onWillPop: () async 
            _saveState();
            return true;
          ,
          child: SafeArea(
            child: Container(),
          ),
        ),
      );

另一个选项是使用hydrated_bloc,它会自动为您保存状态。

【讨论】:

谢谢!我在 Android 模拟器中尝试过,但从未调用过 didChangeAppLifecycleState() - 我尝试单击左上角的箭头,这基本上将路由从堆栈中弹出。我在addObserver 上设置了一个断点,它会被调用。 谢谢,这行得通!但我想知道 - 这似乎是一种不常见的方式。这是 Flutter 中的标准模式吗?正常的 Android 模式非常明确 - 您将数据保存在 onPause() 中。 Flutter 是否没有可供所有应用使用的类似模式? 这就是原生 Android 应用程序的工作方式,几乎每个“第一步”指南都提到了这一点。来自官方文档 (developer.android.com/reference/android/app/…)。许多应用程序没有“保存”按钮,它们只是在您离开屏幕时存储状态,例如使用后退按钮。 Flutter 肯定有类似的概念,我在找这种情况下 Flutter 应用通常会做什么。

以上是关于何时在 Flutter 中持久化数据(等效于 onPause)的主要内容,如果未能解决你的问题,请参考以下文章

将过滤条件放在 join on 语句中是不是等效? [复制]

Flutter中onbackpressed的等效方法是啥

Flutter WebChromeClient 等效,使用 openFileChooser 和 onShowFileChooser

是否可以确定何时使用 JavaScript 渲染了元素?

如何在 Flutter 中直接持久化存储 JSON 数据以供查询和离线使用?

用于 XML 文件持久性的 LINQ to SQL 等效项