Activity 和 Fragment 在 Flutter 中的对应概念是什么?
在 Android 中,一个 Activity 代表用户可以完成的一件独立任务。一个 Fragment 代表一个行为或者用户界面的一部分。 Fragment 用于模块化你的代码,为大屏组合复杂的用户界面,并适配应用的界面。在 Flutter 中,这两个概念都对应于 Widget。
如果要学习更多的关于 Activity 和 Fragment 创建界面的内容,请阅读社区贡献的 Medium 文章, 给 Android 开发者的 Flutter 指南:如何在 Flutter 中设计一个 Activity 界面。
就如在 Intents 部分所提,Flutter 中的界面都是以 Widget 表示的,因为 Flutter 中一切皆为 Widget。你使用 Navigator 在表示不同屏幕或页面,或者仅仅是相同数据的不同状态和渲染的各个 Route 之间进行导航。
如何监听 Android Activity 的生命周期事件?
在 Android 中,你可以覆写 Actvity 的生命周期方法来监听其生命周期,也可以在 Application 上注册 ActivityLifecycleCallbacks。在 Flutter 中,这两种方法都没有,但是你可以通过绑定 WidgetsBinding 观察者并监听 didChangeAppLifecycleState() 的变化事件来监听生命周期。
可以被观察的生命周期事件有:
-
inactive— 应用处于非活跃状态并且不接收用户输入。这个事件只适用于 iOS,Android 上没有对应的事件; -
paused— 应用当前对用户不可见,无法响应用户输入,并运行在后台。这个事件对应于 Android 中的 onPause(); -
resumed— 应用对用户可见并且可以响应用户的输入。这个事件对应于 Android 中的 onPostResume(); -
suspending— 应用暂时被挂起。这个事件对应于 Android 中的 onStop; iOS 上由于没有对应的事件,因此不会触发此事件。
想要了解这些状态含义的更多细节,请查看 AppLifecycleStatus 文档。
你可能已经注意到,只有一小部分的 Activity 生命周期事件是可用的;虽然 FlutterActivity 在内部捕获了几乎所有的 Activity 生命周期事件并将它们发送给 Flutter 引擎,但是它们大部分都向你屏蔽了。 Flutter 为你管理引擎的启动和停止,在大部分情况下几乎没有理由要在 Flutter 一端监听 Activity 的生命周期。如果你需要通过监听生命周期来获取或释放原生的资源,你无论如何都应该在原生一端做这件事。
下面的例子展示了如何监听容器 Activity 的生命周期状态:
import 'package:flutter/widgets.dart';
class LifecycleWatcher extends StatefulWidget {
@override
_LifecycleWatcherState createState() => _LifecycleWatcherState();
}
class _LifecycleWatcherState extends State<LifecycleWatcher> with WidgetsBindingObserver {
AppLifecycleState _lastLifecycleState;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
setState(() {
_lastLifecycleState = state;
});
}
@override
Widget build(BuildContext context) {
if (_lastLifecycleState == null)
return Text('This widget has not observed any lifecycle changes.', textDirection: TextDirection.ltr);
return Text('The most recent lifecycle state this widget observed was: $_lastLifecycleState.',
textDirection: TextDirection.ltr);
}
}
void main() {
runApp(Center(child: LifecycleWatcher()));
}