Flutter macOS UI风格插件macos_ui的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter macOS UI风格插件macos_ui的使用

macos_ui 是一个Flutter插件,它提供了一系列符合macOS设计语言的组件和主题。本文将详细介绍如何使用macos_ui创建具有macOS风格的应用程序,并提供一个完整的示例代码。

插件简介

使用注意事项

Flutter版本

macos_ui基于Flutter的stable通道开发,建议您在stable通道上构建应用程序以确保最佳的开发体验。

平台兼容性

虽然macos_ui可以在任何Flutter支持的平台上运行,但其效果最佳是在macOS上。某些特性(如窗口工具栏样式、颜色选择器等)依赖于macOS的原生代码,因此在其他平台上可能无法正常工作。

弹出框和窗口调整大小

由于当前Flutter不允许UI元素超出窗口边界,弹出框会受到可用空间的限制。因此,在工具栏中使用如ToolBarPopupButton等创建弹出框的小部件时,应避免将应用窗口调整到小于最大弹出框高度。

示例代码

以下是一个完整的示例,展示了如何使用macos_ui构建一个具有侧边栏、搜索框和多个页面切换功能的应用程序:

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:macos_ui/macos_ui.dart';

/// 初始化并设置macOS窗口样式
Future<void> _configureMacosWindowUtils() async {
  const config = MacosWindowUtilsConfig(
    toolbarStyle: NSWindowToolbarStyle.unified,
  );
  await config.apply();
}

void main() async {
  if (!kIsWeb && Platform.isMacOS) {
    await _configureMacosWindowUtils();
  }

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MacosApp(
      title: 'macOS UI Example',
      themeMode: ThemeMode.system,
      home: const HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  int pageIndex = 0;
  final searchFieldController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return PlatformMenuBar(
      menus: menuBarItems(),
      child: MacosWindow(
        sidebar: Sidebar(
          top: MacosSearchField(
            placeholder: 'Search',
            controller: searchFieldController,
            onResultSelected: (result) {
              setState(() {
                pageIndex = ['Buttons', 'Indicators', 'Fields', 'Colors'].indexOf(result.searchKey);
                searchFieldController.clear();
              });
            },
            results: const [
              SearchResultItem('Buttons'),
              SearchResultItem('Indicators'),
              SearchResultItem('Fields'),
              SearchResultItem('Colors'),
            ],
          ),
          minWidth: 200,
          builder: (context, scrollController) {
            return SidebarItems(
              currentIndex: pageIndex,
              onChanged: (i) {
                setState(() => pageIndex = i);
              },
              scrollController: scrollController,
              itemSize: SidebarItemSize.large,
              items: const [
                SidebarItem(
                  label: Text('Buttons'),
                ),
                SidebarItem(
                  label: Text('Indicators'),
                ),
                SidebarItem(
                  label: Text('Fields'),
                ),
                SidebarItem(
                  label: Text('Colors'),
                ),
              ],
            );
          },
        ),
        child: IndexedStack(
          index: pageIndex,
          children: const [
            ButtonsPage(),
            IndicatorsPage(),
            FieldsPage(),
            ColorsPage(),
          ],
        ),
      ),
    );
  }
}

// 模拟页面内容
class ButtonsPage extends StatelessWidget {
  const ButtonsPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Center(child: Text('Buttons Page'));
  }
}

class IndicatorsPage extends StatelessWidget {
  const IndicatorsPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Center(child: Text('Indicators Page'));
  }
}

class FieldsPage extends StatelessWidget {
  const FieldsPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Center(child: Text('Fields Page'));
  }
}

class ColorsPage extends StatelessWidget {
  const ColorsPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Center(child: Text('Colors Page'));
  }
}

主要组件介绍

MacosWindow

MacosWindow是构建macOS风格布局的基础框架。它支持左侧的Sidebar、顶部的TitleBar以及主内容区域。

Sidebar

Sidebar用于导航和快速访问应用程序的主要内容集合。可以通过MacosWindow.sidebar属性放置在左侧,或通过MacosWindow.endSidebar属性放置在右侧。

MacosScaffold

MacosScaffold类似于页面的概念,包含工具栏和子组件。可以将其与CupertinoTabView结合使用,以便更好地管理导航。

ToolBar

ToolBar提供了对常用命令和功能的便捷访问。每个工具栏项都应该有一个对应的菜单栏命令。

SliverToolBar

SliverToolBarToolBar的一个变体,适用于可滚动的小部件,如CustomScrollViewNestedScrollView

MacosListTile

MacosListTile模仿了Flutter Material库中的ListTile,用于显示列表项。

MacosTabView

MacosTabView用于创建多页面界面,允许用户在不同页面之间切换。

Icons

MacosIcon是一种图标小部件,遵循MacosTheme,可以像普通图标一样使用。

Buttons

包括多种类型的按钮,如MacosCheckboxHelpButtonRadioButtonPulldownButtonPopupButtonPushButtonMacosSwitchMacosSegmentedControl

Dialogs and Sheets

MacosAlertDialogMacosSheet分别用于创建对话框和表单。

Fields

MacosTextFieldMacosSearchField分别用于创建文本输入框和搜索框。

Labels

MacosTooltip用于为屏幕上的元素添加简短描述。

Indicators

ProgressCircleProgressBar用于表示进度;CapacityIndicatorRatingIndicator用于表示容量和评分。

Selectors

MacosDatePickerMacosTimePickerMacosColorWell分别用于选择日期、时间和颜色。

总结

通过上述内容,您可以快速上手macos_ui插件,构建出具有macOS风格的Flutter应用程序。更多详细信息和高级用法,请参考官方文档和示例项目。


更多关于Flutter macOS UI风格插件macos_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter macOS UI风格插件macos_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用macos_ui插件来创建具有macOS风格的UI的示例代码。macos_ui插件允许开发者在Flutter应用中实现macOS风格的按钮、对话框和其他UI组件。

首先,确保你已经将macos_ui插件添加到了你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  macos_ui: ^最新版本号  # 替换为实际的最新版本号

然后,运行flutter pub get来安装插件。

接下来,让我们编写一些示例代码来展示如何使用macos_ui插件。

示例代码

  1. main.dart
import 'package:flutter/material.dart';
import 'package:macos_ui/macos_ui.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MacosApp(
      theme: MacosThemeData(
        brightness: Brightness.light,
        primaryColor: MacosColors.systemBlue,
        accentColor: MacosColors.systemGreen,
      ),
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MacosScaffold(
      appBar: MacosAppBar(
        title: Text('macOS UI Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(24.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            MacosButton(
              child: Text('macOS Style Button'),
              onPressed: () {
                showMacosDialog(
                  context: context,
                  title: 'macOS Dialog',
                  content: Text('This is a macOS styled dialog!'),
                  actions: [
                    MacosDialogAction(
                      isDefaultAction: true,
                      child: Text('OK'),
                      onPressed: () {
                        Navigator.of(context).pop();
                      },
                    ),
                  ],
                );
              },
            ),
            SizedBox(height: 24),
            MacosTextField(
              labelText: 'macOS Style TextField',
              hintText: 'Enter some text',
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. MacosApp

    • 包装整个应用,类似于MaterialApp,但使用macOS主题。
  2. MacosThemeData

    • 定义macOS主题,包括亮度、主颜色和强调颜色。
  3. MacosScaffold

    • 类似于Scaffold,但提供macOS风格的布局和组件。
  4. MacosAppBar

    • 创建一个macOS风格的AppBar。
  5. MacosButton

    • 创建一个macOS风格的按钮。
  6. showMacosDialog

    • 显示一个macOS风格的对话框。
  7. MacosDialogAction

    • 定义一个对话框中的操作按钮。
  8. MacosTextField

    • 创建一个macOS风格的TextField。

这个示例展示了如何使用macos_ui插件创建基本的macOS风格UI组件。你可以根据需要进一步自定义和扩展这些组件。确保查阅macos_ui的官方文档以获取更多功能和细节。

回到顶部