如何隐藏并禁用Android导航栏
我正在开发一个全屏应用。为了显示它,我在 initState 方法中使用以下代码:
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
这样就隐藏了系统栏,但当用户从屏幕边缘滑动时,它会重新出现,这是我不想要的。
我该如何彻底禁用这个功能?
解决方案
你不能在普通的Android应用中完全禁用这个手势。SystemUiMode.immersiveSticky 旨在隐藏系统栏,但Android仍然允许用户通过从屏幕边缘滑动来暂时显示它们。这是预期的系统行为,Flutter也无法完全阻止。
你能做的最接近的做法是监听系统UI的变化,并在系统栏再次可见时重新应用沉浸模式:
import 'package:flutter/services.dart';
@override
void initState() {
super.initState();
_hideSystemBars();
SystemChrome.setSystemUIChangeCallback((bool systemOverlaysAreVisible) async {
if (systemOverlaysAreVisible) {
await Future.delayed(const Duration(milliseconds: 300));
_hideSystemBars();
}
});
}
Future<void> _hideSystemBars() {
return SystemChrome.setEnabledSystemUIMode(
SystemUiMode.immersiveSticky,
);
}
@override
void dispose() {
SystemChrome.setSystemUIChangeCallback(null);
super.dispose();
}
每当用户滑动并且导航栏出现时,回调就会被触发,沉浸模式会再次被应用。
然而,这并不真正禁用滑动手势。它只是等到它们出现后再次隐藏系统栏。出于可访问性和系统控制的原因,Android不允许普通应用永久阻止系统导航手势。
如果你需要完全限制导航,通常需要一套信息亭模式/专用设备的设置,而不仅仅是 SystemUiMode.immersiveSticky。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。