Flutter系列之項目篇:入口代碼解析

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>

關注公衆號,隨時接收優質技術文章

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章