喜歡我的小伙伴,一定要關(guān)注我的微信公眾號?。。?!謝謝啦
AllAboutCoding

此文章為翻譯Flutter官網(wǎng)的Flutter for Android Developers - Activities and fragments有興趣的小伙伴可以移步官網(wǎng)查看。
注意:在Flutter應(yīng)用中,你永遠不會希望Android重啟Activity,特別是因為這樣直接反對Android文檔的建議。例如,如果支持分屏,你需要添加** screenLayout**,還可能需要密度(density)。
Flutter中的Activity和Fragment是什么?
在Android中,Activity代表著用戶可以做的集中的事情。Fragment代表用戶的一種行為或用戶的一部分交互。Fragment是一種將你的代碼模塊化的方法,通過結(jié)合用戶的在大屏上的復(fù)雜交互,幫助擴展應(yīng)用的UI。在Flutter中,這兩個概念都在Widget的保護傘之下。
就像Intent那節(jié)提到的一樣,因為在Flutter中一切都是Widget,所以Widget就代表著屏幕(screens)。你可以使用Navigator在兩個不同的Route之間跳轉(zhuǎn),Route代表了不同的頁面或是屏幕,或者可能只是不同的狀態(tài)或相同的數(shù)據(jù)渲染。
如何監(jiān)聽Android Activity 生命周期事件?
在Android中,你可以重寫Activity的方法或者在Application中注冊ActivityLifecycleCallbacks來捕獲Activity的生命周期。在Flutter中,你沒有這些概念,但是你可以通過掛載WidgetsBinding觀察監(jiān)聽didChangeAppLifecycleState()*方法的改變事件來達到監(jiān)聽生命周期事件的目的。
可觀察的生命周期事件有:
- inactive ——應(yīng)用已在活躍狀態(tài),并且還沒有收到用戶操作。因為在Android上沒有等價的映射,所以這個事件僅僅在iOS上有效。
-
paused——應(yīng)用對用戶已不可見,用戶操作已無效,并且在后臺運行。等價于Android的
onPause()方法。 -
resume——應(yīng)用已顯示并且已經(jīng)可以響應(yīng)用戶的操作。等價于Android的
onPostResume ()方法。 - suspending——應(yīng)用暫時處于暫停狀態(tài)。這等價于Android的onStop;因為在iOS上沒有等價的方法,所以這個方法不會在iOS上觸發(fā)。
關(guān)于這些狀態(tài)的更多詳細解釋,請看生命周期狀態(tài)文檔
你可能注意到,只有一小部分Activity生命周期事件有效;而FlutterActivity確實捕獲了Activity的所有生命周期事件并將它們發(fā)送給Flutter引擎,它們絕大多數(shù)都被屏蔽了。Flutter關(guān)注的是給你starting和stopping引擎,在大多數(shù)情況下,F(xiàn)lutter并不是特別需要觀察Activity的生命周期。如果你無論如何都需要觀察生命周期來獲取或者釋放Native資源,那你可能需要在Native端做這件事。
這有一個如何監(jiān)聽Activity的生命周期的狀態(tài)的例子:
import 'package:flutter/widgets.dart';
class LifecycleWatcher extends StatefulWidget {
@override
_LifecycleWatcherState createState() => new _LifecycleWatcherState();
}
class _LifecycleWatcherState extends State<LifecycleWatcher> with WidgetsBindingObserver {
AppLifecycleState _lastLifecyleState;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
setState(() {
_lastLifecyleState = state;
});
}
@override
Widget build(BuildContext context) {
if (_lastLifecyleState == null)
return new Text('This widget has not observed any lifecycle changes.', textDirection: TextDirection.ltr);
return new Text('The most recent lifecycle state this widget observed was: $_lastLifecyleState.',
textDirection: TextDirection.ltr);
}
}
void main() {
runApp(new Center(child: new LifecycleWatcher()));
}