我是一名Android开发人员,我想切换为Flutter。我喜欢热重装功能,该功能可以缩短开发时间。到目前为止,阻止我切换的唯一一件事是,当活动被杀死时,flutter缺少保存应用程序状态的选项。在本机android中,该选项是免费提供的(onSaveInstanceState(Bundle savedInstanceState)
)。所以我的问题是,如何在Flutter中实现相同的功能?谢谢。
答案 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
。现在在您的Android设备上运行该应用程序,点击“计数器”按钮,然后按“主页”按钮以强制Android退出您的应用程序。
再次打开应用程序,您应该看到counter
值仍然存在。
答案 1 :(得分:2)
感谢@CopsOnRoad,以下几点与他的回答有关。
像这样...
void main() {
runApp(
RootRestorationScope( // <--fix
restorationId: 'root',
child: MaterialApp(home: HomePage()),
),
);
}
RestoreationMixin也具有通用名称:RestorationMixin << strong> Home >-不必要,但是如果您以后要声明HomeRestorationMixin,并且要在 didUpdateWidget(主页小部件)方法...
我们还应该为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。