Flutter Material 3布局插件material3_layout的使用
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
并确保设置 useMaterial3
为 true
。
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,
),
),
),
);
结论
感谢阅读!如果您有任何问题,可以通过 Telegram 或 GitHub 联系我。
此Markdown文档涵盖了 `material3_layout` 插件的主要功能和使用示例。希望对您有所帮助!
更多关于Flutter Material 3布局插件material3_layout的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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
文件中包含了flutter
和material
的依赖(这通常是默认包含的):
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),
),
),
),
),
],
),
);
}
}
在这个示例中,我们使用了MaterialApp
和ThemeData
来设置Material 3风格的主题,包括颜色方案和字体。我们还使用了Card
、Row
、Column
和ElevatedButton
等组件来创建布局和组件。这些组件都遵循Material 3的设计原则。
请注意,Material 3的完整实现可能涉及更多的细节和自定义,但这个示例提供了一个良好的起点。如果你需要更具体的Material 3组件或布局,请查阅最新的Flutter文档和Material Design指南。