问题引入
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
// 全局设置状态栏样式
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(
statusBarColor: Colors.red, // Android 状态栏背景颜色
statusBarIconBrightness: Brightness.dark, // 图标黑色
),
);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text("透明 AppBar + 红色状态栏"),
// backgroundColor: Colors.transparent,
elevation: 0,
),
body: const Center(child: Text("Hello Flutter")),
),
);
}
}
上面代码中的SystemUiOverlayStyle是用来设置状态栏的。其中有一个statusBarColor这个配置,是用来设置Android 状态栏背景颜色。
可是一直设置不成功,浪费了好多时间。后来才发现:
Android 13 以下(API < 33):
- Flutter 的
SystemUiOverlayStyle.statusBarColor正常生效。- AppBar 也会配合
systemOverlayStyle正确修改状态栏背景色。- 所以你测试的这段代码 完全有效。
Android 13 及以上(API ≥ 33):
- edge-to-edge 默认开启:状态栏与导航栏变成透明,允许内容延伸到屏幕顶部和底部。
- 状态栏颜色由系统 Window 控制,Flutter 的
SystemUiOverlayStyle只是一个“请求”,系统可能忽略。- AppBar 特殊处理:当你使用 AppBar 时,Flutter 会通过 Window Flags 设置背景色,但如果没有 AppBar,Flutter 不会修改 Window Flags。
Flutter 的跨平台机制
flowchart TD
A[Dart 代码] -->|AOT 编译| B[本地机器码]
B --> C["Flutter 引擎 (C++)"]
C --> D[Skia 渲染引擎]
D --> E[屏幕渲染]
C --> F[Platform Channel]
F --> G[Android/iOS 原生 API]
style A fill:#f9f,stroke:#333,stroke-width:2px
style B fill:#bbf,stroke:#333,stroke-width:2px
style C fill:#ffb,stroke:#333,stroke-width:2px
style D fill:#bfb,stroke:#333,stroke-width:2px
style E fill:#fbb,stroke:#333,stroke-width:2px
style F fill:#fbf,stroke:#333,stroke-width:2px
style G fill:#fff,stroke:#333,stroke-width:2px
- Dart 代码 → 本地机器码:Flutter 的 Dart 代码通过 AOT 编译生成机器码,不依赖虚拟机。
- 本地机器码 → Flutter 引擎 (C++):由 Flutter 引擎执行,管理渲染、事件、手势等。
- Skia 渲染引擎:Flutter 绘制 UI 的核心,直接在 Canvas 上渲染像素。
- Platform Channel → 原生 API:Flutter 与 Android/iOS 的交互通道,用于调用系统功能(状态栏、摄像头、蓝牙等)。
- 屏幕渲染:最终 UI 显示在设备屏幕上,完全由 Flutter 控制。
核心结论
- Flutter 不是在 Android/iOS 的虚拟机上运行 Dart,而是 直接执行本地机器码 + Flutter 引擎。
- Flutter 与系统交互只在 Platform Channel 上,UI 渲染完全由 Flutter 控制。
- 这也是为什么 Flutter 能够跨平台保持一致 UI,同时性能接近原生。
跨平台开发的“隐性成本”
好处:一次写 UI,Android/iOS 都可运行。
成本:
- 依赖系统行为,如果系统升级,功能可能不稳定。
- 系统更新可能带来“默认行为变化”,导致原本生效的 Flutter API失效。
- 需要兼顾 不同版本的兼容性,可能增加代码复杂度(比如你需要判断 API ≥ 33 做特殊处理)。