dart Android键盘导致状态栏重新出现

dfddblmv  于 2023-06-03  发布在  Android
关注(0)|答案(3)|浏览(529)

我需要隐藏我的应用程序中的Android状态栏,所以我使用下面的代码

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

main() {
  SystemChrome.setEnabledSystemUIOverlays([]);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            body: Center(child: TextField()), backgroundColor: Colors.orange));
  }
}

我有一个textfield在屏幕上,所以每当Android键盘打开状态栏重新出现.我已经尝试了多个Android设备,我得到了相同的错误。
这真的是框架中的一个bug,还是我做错了什么?
我在下面附上了一个简短的视频链接来展示这个bug
https://drive.google.com/file/d/19qs5Rsrfc_G1oN5kbxgKvYQAXpTr8RZx/view?usp=sharing
我没有在iOS中测试过

qxsslcnc

qxsslcnc1#

请分享一些代码。我尝试在initState()中添加SystemChrome.setEnabledSystemUIOverlays([]);,并且我有一个文本字段,它工作正常。

x6h2sr28

x6h2sr282#

我所做的是在键盘显示后,延迟2秒(文档说1秒),然后再次调用setEnabledSystemUIOverlays

Future.delayed(Duration(seconds: 2)).then((value) => SystemChrome.setEnabledSystemUIOverlays([]));

根据:https://api.flutter.dev/flutter/services/SystemChrome/setEnabledSystemUIOverlays.html
当键盘变为可见时,它将启用导航栏和状态栏系统UI覆盖。当键盘关闭时,Android不会恢复之前的UI可见性设置,并且在键盘关闭后1秒内不能更改UI可见性,以防止恶意软件锁定用户导航按钮。
要在文本输入后恢复“全屏”,应在延迟1秒后再次设置UI叠加。这可以通过restoreSystemUIOverlays或再次调用它来实现。否则,仅当应用程序失去焦点并重新获得焦点时,才会自动恢复原始UI覆盖设置。

57hvy0tb

57hvy0tb3#

在这里你的代码:

SystemChrome.setEnabledSystemUIOverlays([]);

你应该把setEnabledSystemUIOverlays改为:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky)
      .then((value) {
    runApp(MyApp());
  });
}

我从你的问题中理解到的是你认为这是Flutter中的一个bug,但根据我对Flutter文档的理解,这是一个正常的行为,无论何时显示键盘,显然
这是为了防止恶意软件永久隐藏导航按钮
source
我不知道如何覆盖,但要解决你的问题,你应该使用SystemChrome.restoreSystemUIOverlays();后,你与键盘输入完成。
这应该是我的答案的结束。
但对于那些不知道如何做到这一点,你需要检查的条件,如果键盘是开放的或没有,你可以使用WidgetsBinding.instance.window.viewInsets.bottom,回答Deepak Raj

或者您可以用途:键盘VisibilityBuilder

通过Andrey Gordeevhis answer

KeyboardVisibilityBuilder(
    builder: (context, child, isKeyboardVisible) {
      if (isKeyboardVisible) {
        // when keyboard is visible

      } else {
        // when keyboard is invisible
        SystemChrome.restoreSystemUIOverlays();
      }
      return child;
    },
    child: TextField(),
  )

结果如下:

相关问题