系统相关

系统相关

锁定固定方向

// 在main.dart中
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations([
  // 这里只添加允许的方向
  DeviceOrientation.portraitUp,     // 顶部朝上
  DeviceOrientation.portraitDown,   // 顶部朝下
  DeviceOrientation.landscapeLeft,  // 左侧朝上
  DeviceOrientation.landscapeRight  // 右侧朝上
]);

安卓设备UI模式

// 在主函数指向的Widget中:
class MainApp extends StatelessWidget {
  const MainApp({super.key});

  @override
  Widget build(BuildContext context) {
    // 这里设置UI模式为没有空隙,即可以在导航条或者“刘海”后面添加内容
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
    // 其它内容
  }
}

Warning

不要让UI的内容位于安全区之外,详细见长度参数

macOS系统菜单

菜单模板

Warning

系统按钮如果要适配语言,需要在Xcode中设置语言,简体中文语言见页尾

return Platform.isMacOS ? PlatformMenuBar(
  menus: [
    PlatformMenu(
      label: "App 名称",
      menus: [
        PlatformMenuItemGroup(
          members: [
            PlatformMenuItem(
              label: "关于 App",
              onSelected: (){
                // 显示关于
              }
            )
          ]
        ),
        PlatformMenuItemGroup(
          members: [
            PlatformMenuItem(
              label: "设置",
              shortcut: const SingleActivator(
                LogicalKeyboardKey.comma,
                meta: true,
              ),
              onSelected: (){
                // 前往设置
              }
            ),
          ]
        ),
        const PlatformMenuItemGroup(
          members: [
            PlatformProvidedMenuItem(
              enabled: true,
              type: PlatformProvidedMenuItemType.hide,
            ),
            PlatformProvidedMenuItem(
              enabled: true,
              type: PlatformProvidedMenuItemType.quit,
            ),
          ]
        ),
      ]
    ),
    PlatformMenu(
      label: "编辑",
      menus: [
        PlatformMenuItem(
          label: "拷贝",
          onSelected: (){
            final focusedContext = FocusManager.instance.primaryFocus?.context;
            if (focusedContext != null) {
              Actions.invoke(focusedContext, CopySelectionTextIntent.copy);
            }
          }
        ),
        PlatformMenuItem(
          label: "粘贴",
          onSelected: (){
            final focusedContext = FocusManager.instance.primaryFocus?.context;
            if (focusedContext != null) {
              Actions.invoke(focusedContext, const PasteTextIntent(SelectionChangedCause.keyboard));
            }
          },
        ),
        PlatformMenuItem(
          label: "全选",
          onSelected: (){
            final focusedContext = FocusManager.instance.primaryFocus?.context;
            if (focusedContext != null) {
              Actions.invoke(focusedContext, const SelectAllTextIntent(SelectionChangedCause.keyboard));
            }
          }
        )
      ]
    ),
    const PlatformMenu(
      label: "窗口", 
      menus: [
        PlatformMenuItemGroup(
          members: [
            PlatformProvidedMenuItem(
              enabled: true,
              type: PlatformProvidedMenuItemType.minimizeWindow,
            ),
            PlatformProvidedMenuItem(
              enabled: true,
              type: PlatformProvidedMenuItemType.toggleFullScreen,
            )
          ]
        )
      ]
    )
  ]
) : Container()

语言文件,这个文件位于zh-Hans.lproj/MainMenu.strings

代码见GitHub