Flutter 3.27.0 将 SystemUiMode 的默认值设置为 Edge-to-Edge如果适配不好,可能会影响你的应用整体视觉UI效果

发布于:2025-03-05 ⋅ 阅读:(11) ⋅ 点赞:(0)

Flutter 3.27.0 在 2024/12/12 发布,我的应用从 Flutter 3.22.0 升级到 Flutter 3.27.4版本。
Flutter 3.27.4 在 2025/2/6 发布 ,整个大的改动,还是在 3.27.0版本之初。

Flutter 3.27.0 之后,默认情况下,Android 会针对所有以 Android 15 或更高版本为目标平台的应用强制使用无边框模式。

在这里插入图片描述

在 Flutter 3.27 之前,如果开发者的Flutter 应用默认以 Android 14 为目标,并且不会自动选择进入无边框模式,从 Flutter 版本 3.27 开始它将以 Android 15 为目标,并自动为您的应用选择无边框模式。

在 Flutter 3.27 之后, Flutter 应用在​​ Android 上默认使用SystemUiMode.edgeToEdge,并且设置任何其他SystemUiMode都将不起作用。

要在 SDK 15 上退出无边框设计,需要该设计的每个 Activity 中指定新的样式属性。

默认情况下,Flutter 应用中使用的样式在 Android 清单文件 ( ) 中设置your_app/android/app/src/main/AndroidManifest.xml。通常,样式由 表示@style,并帮助设置应用的主题。在清单文件中修改这些默认样式:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application ...>
        <activity ...>
            <!-- Style to modify: -->
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
            />
        </activity>
    </application>
</manifest>

找到此样式的定义位置your_app/android/app/src/main/res/values/styles.xml。在那里,向样式添加以下属性:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    ...
    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
        ...
	      <!-- 添加下面这一行: -->
        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
    </style>
</resources>

如果你的应用 minsdk <35 , 则需要定义在 values-v35 目录下
在这里插入图片描述
或者 在values 中的styles.xml中 使用 targetApi 来限定:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
   
    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
        <item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
    </style>
</resources>

或者

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">

    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
        <item name="android:windowOptOutEdgeToEdgeEnforcement" tools:ignore="NewApi">true</item>
    </style>
</resources>