Dart入口代碼
用Dart語言編寫的跨平臺代碼置於Flutter項目的lib目錄下。
在java中,程序的執行入口是main方法,該main方法爲某個類的靜態方法(static method)。
類似於java,dart程序的執行入口是名爲main的函數。該main函數爲頂級函數(top-level function),不屬於任何類(static function)或對象(instance function),可獨立調用,不必通過類或對象。
例如,在main.dart文件中定義一個main函數:
void main() => runApp(RootWidget());
“=>”語法爲dart的一個語言特性,當方法體只有一句代碼時,可省略花括號,用“=>”代替。上面的代碼等價於:
void main(){
runApp(RootWidget());
}
在flutter中,widget爲構建UI界面的元素,同時,一個界面就是一個widget(作爲根widget,可添加child widget,形成一個複雜的widget tree)。
runApp是啓動flutter界面的方法,接收一個widget參數,作爲第一個flutter界面。
Dart程序與Android入口activity銜接
入口activity需繼承FlutterActivity,並通過GeneratedPluginRegistrant類的registerWith方法,將入口activity與dart程序銜接。GeneratedPluginRegistrant類由flutter插件自動生成。
class MainActivity: FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
GeneratedPluginRegistrant.registerWith(this)
}
}
配置AndroidManifest.xml文件,
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="zzq.coder.com.flutter_app">
<application
android:name="io.flutter.app.FlutterApplication"
android:label="flutter_app"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
application的實現類必須爲io.flutter.app.FlutterApplication或其子類。
入口activity中配置了一個meta-data,
<meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true" />
啓動app到flutter UI渲染出第一幀需要消耗一定的時間,上面的配置表示,將該activity作爲歡迎頁展示,直到flutter渲染出第一幀。
爲入口activity配置主題風格,指定歡迎頁窗口背景,
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
</resources>