导航栏出现时,SystemChrome.setSystemUIChangeCallback不会被触发
这是一个用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。