如何获得完美的全屏(边到边)模式以实现颤振?
使用原生,很容易做到下图,目标是状态栏,系统只显示文字、图标,底部导航是一样的,但应用程序的颜色保持不变。
Flutter横屏有点问题,也可以看下图
我使用了颤振代码进行边缘到边缘的选项,例如:
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
systemNavigationBarContrastEnforced: false,
statusBarColor: Colors.transparent,
systemNavigationBarColor: Colors.transparent,
systemStatusBarContrastEnforced: false,
));
注意:如果尝试使用模拟器,请使用 deviceframe 和缺口设备(如 Pixel 6a)创建,我使用 api 34
正确应用它很重要:
EdgeToEdgeWrapperWidget
应用于每个页面作为根小部件SafeArea(bottom: false, top: false)
SafeArea
作为具有背景的容器小部件的父小部件对于下面的解决方案,我使用了代码:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
/// A quick and easy way to style the navigation bar bar in Android
/// to be transparent and edge-to-edge, like iOS is by default.
SystemUiOverlayStyle customOverlayStyle(
{final bool transparentStatusBar = false}) {
unawaited(SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge));
final statusBarColor = transparentStatusBar ? Colors.transparent : null;
return SystemUiOverlayStyle(
statusBarColor: statusBarColor,
systemNavigationBarColor: Colors.transparent,
systemNavigationBarDividerColor: Colors.transparent,
);
}
class EdgeToEdgeWrapperWidget extends StatelessWidget {
final Widget child;
final bool transparentStatusBar;
EdgeToEdgeWrapperWidget(
{super.key, this.transparentStatusBar = false, required this.child});
@override
Widget build(BuildContext context) {
return AnnotatedRegion(
value: customOverlayStyle(transparentStatusBar: transparentStatusBar),
child: child,
);
}
}