当活动被系统杀死时,如何在波动中保存应用程序状态?

时间:2019-11-25 22:09:24

标签: android flutter

我是一名Android开发人员,我想切换为Flutter。我喜欢热重装功能,该功能可以缩短开发时间。到目前为止,阻止我切换的唯一一件事是,当活动被杀死时,flutter缺少保存应用程序状态的选项。在本机android中,该选项是免费提供的(onSaveInstanceState(Bundle savedInstanceState))。所以我的问题是,如何在Flutter中实现相同的功能?谢谢。

4 个答案:

答案 0 :(得分:3)

从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

enter image description here

  • 现在在您的Android设备上运行该应用程序,点击“计数器”按钮,然后按“主页”按钮以强制Android退出您的应用程序。

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

答案 1 :(得分:2)

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

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

像这样...

void main() {
      runApp(
          RootRestorationScope( // <--fix
          restorationId: 'root',
          child: MaterialApp(home: HomePage()),
        ),
      );
    }
  1. RestoreationMixin也具有通用名称:RestorationMixin << strong> Home >-不必要,但是如果您以后要声明HomeRestorationMixin,并且要在 didUpdateWidget(主页小部件)方法...

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

所以会

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

答案 2 :(得分:1)

您需要使用插件和方法通道,才能知道何时保留事物以及何时还原事物。为此,您可以使用以下库:

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

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

答案 3 :(得分:0)

只有WidgetsBindingObserver与didChangeAppLifecycleState方法一起使用,可以用来处理AppLifecycleState