解決啟動(dòng)白屏或黑屏
出現(xiàn)此情況的原因有兩種
-
FlutterView顯示第一幀之前样悟,安卓會(huì)加載flutter的SDK作媚,將dart代碼加載在內(nèi)存中攘滩,過(guò)程中android沒(méi)有可以顯示的東西,出現(xiàn)白屏纸泡。(android 方面原因)
解決:
找到 \app\src\main\res\drawable\launch_background.xml 文件漂问,這個(gè)里面初始化了布局標(biāo)簽,只需要把圖片替換為我們自己的就可以。
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
<!--@drawable/launch_screen就是圖片路徑 可以在當(dāng)前同文件夾下 放置要顯示的圖片-->
<item>
<bitmap
android:gravity="center"
android:src="@drawable/launch_screen" />
</item>
</layer-list>
或者根據(jù)不同手機(jī)的分辨率 在mipmap下放置圖片例如:
之后前往 styles.xml 文件設(shè)置啟動(dòng)頁(yè)
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<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:windowFullscreen">true</item>-->
<!-- 設(shè)置啟動(dòng)背景 引入啟動(dòng)頁(yè) xml-->
<item name="android:windowBackground">@drawable/launch_background</item>
<!-- 啟動(dòng)時(shí)狀態(tài)欄狀態(tài)是否透明-->
<item name="android:windowIsTranslucent">true</item>
</style>
</resources>
重新打包就可以看到 剛剛設(shè)置的啟動(dòng)頁(yè)了
效果例如:
[圖片上傳失敗...(image-7e5c2-1586668143446)]
- 從現(xiàn)象觀察女揭,啟動(dòng)頁(yè)中間有一段時(shí)間黑屏蚤假,這個(gè)為什么呢?前面我們說(shuō)過(guò)吧兔,F(xiàn)lutter的啟動(dòng)流程分成兩部分磷仰,一部分是Android啟動(dòng)階段,一個(gè)是Flutter的啟動(dòng)階段境蔼,這個(gè)黑屏就是Flutter的啟動(dòng)階段沒(méi)有啟動(dòng)頁(yè)所造成的灶平。我們從源碼入手,詳細(xì)分析一下欧穴,下面是FlutterActivityDelegate的部分源碼民逼。參考鏈接
解決:找到 \app\src\main\AndroidManifest.xml 文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.flutterxc">
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement-->
<application
android:usesCleartextTraffic="true"
android:name="io.flutter.app.FlutterApplication"
android:label="flutterxc" //自定義app名稱
android:icon="@mipmap/xc_logo" //自定義app logo
>
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
// 添加這兩段代碼 可解決 黑屏問(wèn)題(出現(xiàn)紅線 或者 異常沒(méi)關(guān)系,可以編譯成功)
+ <meta-data
+ android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
+ android:value="true" />
// 將資源指向我們的啟動(dòng)頁(yè)路徑
+ <meta-data
+ android:name="io.flutter.embedding.android.SplashScreenDrawable"
+ android:resource="@drawable/launch_background" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
至此可以流暢的打開(kāi)啟動(dòng)頁(yè)了