导航栏出现时,SystemChrome.setSystemUIChangeCallback不会被触发

移动开发 2026-07-08

这是一个用Flutter开发的自助终端应用。

当用户试图通过从边缘滑动来显示导航栏时,我需要立即隐藏导航栏。

我在 MyHomePageState 类中尝试了以下代码:

@override
  void initState() {
    super.initState();
    _hideSystemBars();
  }

Future<void> _hideSystemBars() {
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);

    // Re-apply if the user swipes and the system bars become visible
    SystemChrome.setSystemUIChangeCallback((
      bool systemOverlaysAreVisible,
    ) async {
      if (systemOverlaysAreVisible) {
        await Future.delayed(const Duration(milliseconds: 500));
        SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
      }
    });

    return Future.value();
  }

UIChangeCallback 只在应用刚启动时运行一次,带着 systemOverlaysAreVisible = false。导航栏显示时,回调不会被调用。

我该怎么解决?

解决方案

Flutter的沉浸模式是对Android系统UI标志的封装。

当用户从边缘滑动时,Android会临时显示导航栏,但不会通知Flutter。

要拦截这个,你必须在Android主应用中覆写OnSystemUiVisibilityChangeListener。

...src/main/kotlin/.../MainActivity.kt

class MainActivity : FlutterActivity() {
    override fun onPostResume() {
        super.onPostResume()

        window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
            val isVisible = (visibility and View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0
            if (isVisible) {
                window.decorView.systemUiVisibility =
                    (View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                     or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                     or View.SYSTEM_UI_FLAG_FULLSCREEN)
            }
        }
    }
}
  • Android总是在导航栏出现时触发OnSystemUiVisibilityChangeListener。
  • 你会立即重新应用沉浸式粘性模式。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章