我们最近将 Flutter 应用程序升级到 3.24.1,并注意到我们的 Android 应用程序现在持续显示工具栏,似乎无论我对应用程序的主题做什么来解决这个问题。我们知道这是 Android ToolBar,而不是 Flutter 的 AppBar,因为 iOS 中不会发生这种情况:
当前
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
<style name="Theme.App.Starting" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">#804EFD</item>
<item name="postSplashScreenTheme">@style/NormalTheme</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_splash_layer</item>
</style>
</resources>
AndroidManifest.xml
中的应用程序标签:
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="App name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
tools:replace="android:supportsRtl">
AndroidManifest.xml
中的活动标签:
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:exported="true"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:theme="@style/Theme.App.Starting"
android:windowSoftInputMode="adjustResize">
class MainActivity : FlutterFragmentActivity() {
private var methodChannelResult: MethodChannel.Result? = null
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
CHANNEL
).setMethodCallHandler { call, result ->
this.methodChannelResult = result
}
}
}
这个设置实际上已经很长一段时间没有动过,但这个版本似乎除了扩展标记为
NoTitleBar
的主题之外还想要其他东西。
截图:
styles.xml
和values-night/styles.xml
中包括以下内容:<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
很多答案都建议全屏,但这不仅行不通,而且还行不通。我不想为了追求期望的结果而隐藏状态栏。我在
LaunchTheme
、NormalTheme
和 Theme.App.Starting
上完整和部分地尝试了上述内容。
MainActivity.kt
:override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.window.requestFeature(Window.FEATURE_NO_TITLE)
}
这感觉有点矫枉过正(如果您无论如何都必须在代码中进行调用,那么 XML 主题又是为了什么?)并且它会抛出一个错误,说明在添加内容之前必须调用
requestFeature()
(我实际调用的方法)。
我很想知道:
如果此更改已记录在某处,而我只是一个假人,请随意投反对票
解决此问题的方法是在我的 AndroidManifest.xml 中显式引用正常主题:
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
tools:replace="android:supportsRtl">
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" />
<!-- Rest of your Manifest's application stuff-->
</application>
默认情况下,新项目会发生这种情况,我的应用程序的新构建风格已经具备此功能就证明了这一点。
这里有一个迁移指南提到了这一点: