繁体   English   中英

Flutter 应用恢复; 当活动被系统杀死时如何保存应用程序状态?

[英]Flutter app restoration; how to save the app state when the activity is killed by the system?

我是一名 android 开发人员,我想切换到 flutter。 我喜欢允许更快开发时间的热重载功能。 到目前为止,唯一阻止我切换的是 flutter 缺少在 Activity 被终止时保存应用程序状态的选项。 在原生 android 中,该选项是免费提供的( onSaveInstanceState(Bundle savedInstanceState) )。 所以我的问题是,如何在 Flutter 中实现相同的功能? 谢谢。

从 Flutter 1.22(现在稳定)开始,您可以使用RestorationMixin 这是一个完整的例子:

void main() {
  runApp(
    RootRestorationScope(
      restorationId: 'root',
      child: MaterialApp(home: HomePage()),
    ),
  );
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with RestorationMixin {
  final RestorableInt _counter = RestorableInt(0);

  @override
  String get restorationId => 'HomePage';

  @override
  void restoreState(RestorationBucket oldBucket, bool initialRestore) {
    registerForRestoration(_counter, 'counter');
  }

  @override
  void dispose() {
    _counter.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          child: Text('${_counter.value}'),
          onPressed: () => setState(() => ++_counter.value),
        ),
      ),
    );
  }
}

如何测试:

  • 转到您的设备设置 - 开发人员选项并打开Don't keep activities

在此处输入图片说明

  • 现在在您的 Android 设备上运行该应用程序,点击 Counters 按钮并点击主页按钮以强制 Android 退出您的应用程序。

  • 再次打开应用程序,您应该会看到counter值仍然存在。

你需要使用插件和方法通道来知道什么时候保持事物,什么时候恢复事物。 为此,您可以使用以下库:

https://github.com/littlerobots/flutter-native-state

它允许您将状态发送到 Android 端的 Bundle 中,并通过方法通道将恢复的状态传达回 Flutter。

感谢@CopsOnRoad,以下几点与他的回答有关。

  1. 我们应该使用RootRestorationScope而不是RestorationScope

像这样...

void main() {
      runApp(
          RootRestorationScope( // <--fix
          restorationId: 'root',
          child: MaterialApp(home: HomePage()),
        ),
      );
    }
  1. RestorationMixin 也有通用的: RestorationMixin< HomePage > - 不是必需的,但如果你想稍后声明你的 HomeRestorationMixin,并且如果你想在didUpdateWidget(HomePage widget)方法中做出正确的签名......

  2. 我们还应该为 State 的每个属性手动运行 dispose():

所以它会

class _HomePageState extends State<HomePage> with 
  RestorationMixin<HomePage> { // <-- optional
  ...
  @override
  void dispose() {
    _counter.dispose(); // <-- recommended
    super.dispose();
  }
}

WidgetsBindingObserver只有didChangeAppLifecycleState方法,您可以使用处理AppLifecycleState的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM