使颤振应用全屏

我怎样才能使颤振应用程序全屏。我已经知道如何隐藏状态栏 在 Flutter App 上隐藏 Android 状态栏。但我似乎找不到隐藏机器人导航栏的方法。

80597 次浏览

这和 Android 的状态栏一模一样。

执行 SystemChrome.setEnabledSystemUIOverlays([])会同时隐藏状态栏和导航栏。

用这个 SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values);禁用全屏模式。

AppBar 是您的导航栏,因此只需将它从代码中删除,如下所示

//新建此代码它应该工作,AppBar 是导航栏

import 'package:flutter/material.dart';


void main() => runApp(new MyApp());


class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new Scaffold(
body: new Center(
child: new Text('Hello World'),
),
),
);
}
}
// to hide only bottom bar:
SystemChrome.setEnabledSystemUIOverlays ([SystemUiOverlay.top]);


// to hide only status bar:
SystemChrome.setEnabledSystemUIOverlays ([SystemUiOverlay.bottom]);


// to hide both:
SystemChrome.setEnabledSystemUIOverlays ([]);

下面的代码非常适合全屏显示

SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values);
import 'package:flutter/services.dart';
////


@override
Widget build(BuildContext context) {
///Set color status bar
SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values);
return Scaffold(
backgroundColor: Colors.white,
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image.asset(
'images/ic_splash_logo.png',
width: 97.0,
height: 115.0,
fit: BoxFit.contain,
),
SizedBox(
height: 10.0,
),
Text(
'iComplain',
style: TextStyle(fontSize: 24,
color: Color(0xFF174D73),
fontFamily: 'Helvetica'
),
),
],
),
),
);
}

SystemChrome.setEnabledSystemUIOverlay ([]) ;

这隐藏了顶部和底部的酒吧,但应用程序的大小保持不变。它不会扩展到全屏幕高度。

最后,我找到了一种方法来设置一个类为全屏。禁用其他类。

要设置全屏幕把这个代码在 InitState ()

SystemChrome.setEnabledSystemUIOverlay ([]) ;

然后恢复到正常状态,在 处置

SetEnabledSystemUIOverlay (SystemUiOverlay.values) ;

同班同学。

@override
void dispose() {
SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values);
super.dispose();
}
    

@override
initState() {
SystemChrome.setEnabledSystemUIOverlays([]);
super.initState();
}

你不能设置

SystemChrome.restoreSystemUIOverlays();

处置。因为它已经说

**Restores the system overlays to the last settings provided via [setEnabledSystemUIOverlays].**
May be used when the platform force enables/disables UI elements.
          

For example, when the Android keyboard disables hidden status and navigation bars,
this can be called to re-disable the bars when the keyboard is closed.
          

On Android, the system UI cannot be changed until 1 second after the previous
change. This is to prevent malware from permanently hiding navigation buttons.`

这是我的经验,如果我添加 SystemChrome.setEnabledSystemUIOverlays([]);initdispose,状态栏和导航栏将返回当你使用键盘,但如果你像这样使用它的工作完美:

  @override
Widget build(BuildContext context) {


// To make this screen full screen.
// It will hide status bar and notch.
SystemChrome.setEnabledSystemUIOverlays([]);


// full screen image for splash screen.
return Container(
child: new Image.asset('assets/splash.png', fit: BoxFit.fill));
}
}

在你的小部件里

在 initState ()中使用 SystemChrome.setEnabledSystemUIOverlay ([]) ,如下所示:

  void initState() {
super.initState();
print("Splash");


// Start full screen
SystemChrome.setEnabledSystemUIOverlays([]);
}

以全屏模式启动屏幕。

接下来使用 SystemChrome.setEnabledSystemUIOverlay (SystemUiOverlay.values) ; 在您的 pose ()函数中退出下一个屏幕的全屏模式。

  void dispose() {
super.dispose();
// Exit full screen
SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values);
}

在主要部分使用 SystemChrome.setEnabledSystemUIOverlays([]);,如果出现错误,可以事先使用 WidgetsFlutterBinding.ensureInitialized();

但是,这不会持续通过应用程序,并在文本字段失去焦点后,你应该调用 SystemChrome.restoreSystemUIOverlays()后1秒钟。显然是 “这是为了防止恶意软件永久隐藏导航按钮”。(为什么不只是保持向下滑动的手势,以防止被“卡在”应用程序?) 无论如何 我的应用程序有很多表格,这种方法似乎很费工夫。

我想这个解决方案是有点古怪,但我刚刚创建了一个服务运行在后台上的定时器每秒运行 SystemChrome.restoreSystemUIOverlays()它看起来像这样:

    class FullscreenService{
  

Timer? timer;
static FullscreenService? _instance;
FullscreenService._internal() {
timer = Timer.periodic(
Duration(seconds: 1), (Timer t) =>
SystemChrome.restoreSystemUIOverlays);
}


factory FullscreenService() => _instance ?? FullscreenService._internal();


void cancelTimer(){
timer!.cancel();
}
}

我希望我不会使用这在未来,如果有人有任何想法如何避免这仍然保持全屏幕请让我知道... 但至少它现在的工作。

在新版本中,Flutter 使用以下代码:

SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);

或者

 SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);

使用 setEnabledSystemUIMode(推荐) :

  • 全萤幕(修复) :

    SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
    
  • 全萤幕(无须修复) :

    SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);
    
  • 显示一个特殊的覆盖层:

    SystemChrome.setEnabledSystemUIMode(
    SystemUiMode.manual,
    overlays: [
    SystemUiOverlay.top, // Shows Status bar and hides Navigation bar
    ],
    );
    
  • 退出全屏幕:

    SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
    

恢复: 一旦状态栏和导航栏出现,它们将再次隐藏。

initState()build()方法中使用 SystemChrome.setEnabledSystemUIOverlays([]);调用 WidgetsFlutterBinding.ensureInitialized();WidgetsFlutterBinding.ensureInitialized();正在重新构建小部件并调用 build()方法两次,为了解决这个问题,我在我的 main()函数中使用这个函数

void main() {


SystemChrome.setEnabledSystemUIOverlays([]);
...
...
..
.

使用 这个酒吧套餐以一种干净的方式来做。

如果你想为特定的屏幕启用它,确保这个屏幕是一个状态部件(你可以很容易地用 IDE 工具转换它)并覆盖 initState ()和 pose () :

import 'package:fullscreen/fullscreen.dart';


class ClockScreen extends StatefulWidget {
const ClockScreen({Key? key}) : super(key: key);


@override
State<ClockScreen> createState() => _ClockScreenState();
}


class _ClockScreenState extends State<ClockScreen> {


@override
void initState(){
FullScreen.enterFullScreen(FullScreenMode.EMERSIVE_STICKY);
super.initState();
}
  

@override
void dispose(){
FullScreen.exitFullScreen();
super.dispose();
}


@override
Widget build(BuildContext context) {
...
}