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>