Flutter Material 3布局插件material3_layout的使用

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

Flutter Material 3布局插件material3_layout的使用

概述

material3_layout 是一个简化开发适应不同屏幕尺寸(紧凑、中等和大屏)应用的Flutter插件。它基于Material Design 3指南构建。

特性

  • 自动切换主导航,基于三个断点(紧凑/中等/扩展)
  • 支持底部导航栏(移动端)、侧边导航栏、抽屉式导航和模态抽屉式导航
  • 页面切换无需状态管理
  • 提供三种布局(单面板/双面板/分隔面板)
  • 材料设计3主题支持
  • 主题模式切换
  • 简单API

安装

pubspec.yaml 文件中添加 material3_layout 作为依赖:

dependencies:
  material3_layout: ^0.0.1
  get: ^lastVersion

使用

第一步

首先,将 MaterialApp 更改为 GetMaterialApp 并确保设置 useMaterial3true

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

  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      theme: ThemeData(
        useMaterial3: true,
      ),
      darkTheme: ThemeData(
        useMaterial3: true,
      ),
      themeMode: ThemeMode.light,
      home: const ScreenWidget(),
    );
  }
}

NavigationScaffold

NavigationScaffold 是用于管理主导航的修改版 Scaffold,不需要再包裹在常规 Scaffold 中。

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

  @override
  Widget build(BuildContext context) {
    return NavigationScaffold(
      appBar: AppBar(
        title: Text('App title'),
        centerTitle: true,
      ),
      theme: Theme.of(context),
      navigationType: NavigationTypeEnum.railAndBottomNavBar,
      navigationSettings: RailAndBottomSettings(
        pages: <Widget>[],
        destinations: [
          DestinationModel(
            label: 'Home',
            icon: const Icon(Icons.home_outlined),
            selectedIcon: const Icon(Icons.home_filled),
            tooltip: 'Home page',
          ),
        ],
        addThemeSwitcherTrailingIcon: true,
        groupAlignment: -1.0,
        labelType: NavigationRailLabelType.all,
      ),
      onDestinationSelected: (int index) => log('Page changed: $index'),
    );
  }
}

参数说明

  • appBar: 可选参数,用于显示应用程序标题。
  • theme: 必需参数,传递 ThemeData 实例。
  • navigationType: 选择主导航类型,如 drawer, modalDrawer, 或 railAndBottomNavBar
  • navigationSettings: 配置主导航显示方式。
  • onDestinationSelected: 用户导航到特定页面时执行的业务逻辑。

PageLayout Widget

PageLayout 控制内容在不同屏幕尺寸上的显示方式。

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

  @override
  Widget build(BuildContext context) {
    return const PageLayout(
      compactLayout: SinglePaneLayout(
        verticalPadding: 10,
        child: YourContentWidget(),
      ),
      mediumLayout: SinglePaneLayout(
        verticalPadding: 24,
        child: YourContentWidget(),
      ),
      expandedLayout: TwoPaneLayout(
        fixedPaneChild: YourFixedWidgetHere(),
        flexiblePaneChild: YourFlexibleWidgetHere(),
        fixedPanePosition: FixedPanePositionEnum.left,
        verticalPadding: 0,
      ),
    );
  }
}

示例

单面板布局

return PageLayout(
  compactLayout: SinglePaneLayout(
    child: PaneContainerWidget(
      borderRadius: 0,
      child: ProductList(
        onTap: () {
          Get.to(const DetailsPage());
        },
      ),
    ),
  ),
);

双面板布局

return PageLayout(
  expandedLayout: TwoPaneLayout(
    verticalPadding: 24,
    fixedPaneChild: PaneContainerWidget(
      surfaceColor: SurfaceColorEnum.surfaceContainerLow,
      child: ProductList(
        onTap: () {},
      ),
    ),
    flexiblePaneChild: PaneContainerWidget(
      child: Obx(() {
        final controller = Get.find<ProductPageController>();
        return Center(
          child: Image.asset(controller.selectedProduct.photoUrl),
        );
      }),
    ),
  ),
);

分隔面板布局

return SplitPaneLayout(
  leftChild: PaneContainerWidget(
    surfaceColor: SurfaceColorEnum.surfaceContainerLow,
    child: Center(
      child: Text(
        'medium layout left child',
        style: Get.textTheme.headlineMedium,
      ),
    ),
  ),
  rightChild: PaneContainerWidget(
    surfaceColor: SurfaceColorEnum.surface,
    child: Center(
      child: Text(
        'medium layout right child',
        style: Get.textTheme.headlineMedium,
      ),
    ),
  ),
);

结论

感谢阅读!如果您有任何问题,可以通过 TelegramGitHub 联系我。

Buy me a coffee


此Markdown文档涵盖了 `material3_layout` 插件的主要功能和使用示例。希望对您有所帮助!

更多关于Flutter Material 3布局插件material3_layout的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Material 3布局插件material3_layout的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用material3_layout插件的简单示例。请注意,material3_layout并非一个官方或广泛认可的Flutter插件,但基于你的要求,我将展示一个假设的Material 3风格的布局实现,通常你可以通过官方的flutter/material包来实现Material 3的设计。

首先,确保你的pubspec.yaml文件中包含了fluttermaterial的依赖(这通常是默认包含的):

dependencies:
  flutter:
    sdk: flutter

接下来,在你的Dart文件中,你可以使用Flutter的Material 3风格组件来布局你的UI。虽然Flutter官方并未直接提供一个名为material3_layout的插件,但你可以通过Material 3组件和布局原则来实现类似的效果。

以下是一个示例代码,展示了如何使用Material 3风格的组件和布局:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material 3 Layout Example',
      theme: ThemeData(
        // 使用Material 3主题
        colorScheme: ColorScheme.fromSeed(
          seedColor: Colors.blue,
          brightness: Brightness.light,
        ),
        typography: Typography.material2021(), // 使用Material 3的字体
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Material 3 Layout'),
        ),
        body: Material3LayoutExample(),
      ),
    );
  }
}

class Material3LayoutExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text(
            'Material 3 Layout Example',
            style: Theme.of(context).textTheme.headline4,
          ),
          SizedBox(height: 16),
          Row(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Expanded(
                child: Card(
                  elevation: 4,
                  child: Padding(
                    padding: const EdgeInsets.all(16.0),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Text(
                          'Card 1',
                          style: Theme.of(context).textTheme.headline6,
                        ),
                        SizedBox(height: 8),
                        Text(
                          'This is the content of the first card.',
                          style: Theme.of(context).textTheme.bodyText1,
                        ),
                      ],
                    ),
                  ),
                ),
              ),
              SizedBox(width: 16),
              Expanded(
                child: Card(
                  elevation: 4,
                  child: Padding(
                    padding: const EdgeInsets.all(16.0),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Text(
                          'Card 2',
                          style: Theme.of(context).textTheme.headline6,
                        ),
                        SizedBox(height: 8),
                        Text(
                          'This is the content of the second card.',
                          style: Theme.of(context).textTheme.bodyText1,
                        ),
                      ],
                    ),
                  ),
                ),
              ),
            ],
          ),
          SizedBox(height: 32),
          ElevatedButton(
            onPressed: () {},
            child: Text('Material 3 Button'),
            style: ButtonStyle(
              backgroundColor: MaterialStateProperty.all(Colors.blue),
              foregroundColor: MaterialStateProperty.all(Colors.white),
              shape: MaterialStateProperty.all(
                RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(16),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们使用了MaterialAppThemeData来设置Material 3风格的主题,包括颜色方案和字体。我们还使用了CardRowColumnElevatedButton等组件来创建布局和组件。这些组件都遵循Material 3的设计原则。

请注意,Material 3的完整实现可能涉及更多的细节和自定义,但这个示例提供了一个良好的起点。如果你需要更具体的Material 3组件或布局,请查阅最新的Flutter文档和Material Design指南。

回到顶部