Flutter自定义应用栏插件metro_appbar的使用

Flutter自定义应用栏插件metro_appbar的使用

metro_appbar 是一个具有简洁易读设计的自定义应用栏插件。它允许用户自定义按钮和菜单样式。

使用示例

在你的 Flutter 项目中添加 metro_appbar 并将其集成到应用中。以下是完整的代码示例:

import 'package:flutter/material.dart';
import 'package:metro_appbar/metro_appbar.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MetroAppBar 示例',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'MetroAppBar 示例'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, this.title}) : super(key: key);
  final String? title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class AppBarStyle {
  final Color? color;
  final Color firstButtonColor;
  final double? height;
  final BorderRadius borderRadius;
  final EdgeInsets padding;
  final bool withSecondary;

  AppBarStyle(this.color, this.firstButtonColor, this.height, this.borderRadius,
      this.padding,
      {this.withSecondary = true});
}

class _MyHomePageState extends State<MyHomePage> {
  final List<AppBarStyle> _styles = [
    AppBarStyle(null, Colors.red, null, BorderRadius.zero, EdgeInsets.all(0)),
    AppBarStyle(Colors.pink[50], Colors.green, 60, BorderRadius.circular(12), EdgeInsets.fromLTRB(8, 8, 8, 12)),
    AppBarStyle(Colors.green[100], Colors.purple, 72, BorderRadius.zero, EdgeInsets.all(0)),
    AppBarStyle(Colors.red, Colors.cyan, null, BorderRadius.circular(36), EdgeInsets.all(6), withSecondary: false),
    AppBarStyle(Colors.indigo[400], Colors.white, null, BorderRadius.zero, EdgeInsets.all(0), withSecondary: false),
  ];

  String _pushedButtonText = '';
  late AppBarStyle _currentStyle;

  void _setPushedButtonText(String text) {
    setState(() {
      _pushedButtonText = text;
    });
  }

  void _updateStyle() {
    setState(() {
      _currentStyle = _styles[(_styles.indexOf(_currentStyle) + 1) % _styles.length];
    });
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    _currentStyle = _styles[0];
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title!),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            Expanded(
              child: Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text(
                      '你点击了按钮:',
                    ),
                    Text(
                      '$_pushedButtonText',
                      style: Theme.of(context).textTheme.headline4,
                    ),
                    Padding(
                      padding: const EdgeInsets.all(12.0),
                      child: RawMaterialButton(
                        padding: const EdgeInsets.all(6.0),
                        onPressed: () {
                          _updateStyle();
                        },
                        fillColor: Colors.blue,
                        child: Text(
                          '更改样式',
                          style: TextStyle(color: Colors.white),
                        ),
                      ),
                    ),
                  ],
                ),
              ),
            ),
            Padding(
              padding: _currentStyle.padding,
              child: MetroAppBar(
                backgroundColor: _currentStyle.color,
                borderRadius: _currentStyle.borderRadius,
                height: _currentStyle.height,
                primaryCommands: [
                  PrimaryCommand(
                    onPressed: () {
                      _setPushedButtonText('Eiusmod');
                    },
                    color: Colors.green,
                    icon: Icons.account_balance_rounded,
                    text: 'Eiusmod',
                  ),
                  PrimaryCommand(
                    onPressed: () {
                      _setPushedButtonText('Reprehenderit qui');
                    },
                    icon: Icons.ac_unit,
                    color: Colors.amber,
                    width: 80,
                    text: 'Reprehenderit qui',
                  ),
                  PrimaryCommand(
                    onPressed: () {
                      _setPushedButtonText('Ipsum');
                    },
                    icon: Icons.accessible_outlined,
                    text: 'Ipsum',
                  ),
                  PrimaryCommand(
                    onPressed: () {
                      _setPushedButtonText('Dolor');
                    },
                    icon: Icons.picture_in_picture_alt_rounded,
                    text: 'Dolor',
                  ),
                  PrimaryCommand(
                    color: _currentStyle.firstButtonColor,
                    onPressed: () {
                      _setPushedButtonText('Velit');
                    },
                    icon: Icons.event_note,
                  ),
                ],
                secondaryCommands: _currentStyle.withSecondary
                    ? [
                        SecondaryCommand(
                          onPressed: () {
                            _setPushedButtonText('Commodo');
                          },
                          text: 'Commodo',
                        ),
                        SecondaryCommand(
                          onPressed: () {
                            _setPushedButtonText('Officia');
                          },
                          text: 'Officia',
                        ),
                      ]
                    : null,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter自定义应用栏插件metro_appbar的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义应用栏插件metro_appbar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


metro_appbar 是一个用于 Flutter 的自定义应用栏插件,它可以帮助你创建类似于 Windows Metro 风格的应用栏。这个插件提供了丰富的自定义选项,允许你轻松地创建符合你应用设计风格的应用栏。

安装

首先,你需要在 pubspec.yaml 文件中添加 metro_appbar 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  metro_appbar: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

基本用法

以下是一个简单的示例,展示了如何使用 metro_appbar 插件创建一个基本的应用栏:

import 'package:flutter/material.dart';
import 'package:metro_appbar/metro_appbar.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Metro AppBar Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: MetroAppBar(
          title: Text('Metro AppBar Example'),
          actions: [
            IconButton(
              icon: Icon(Icons.search),
              onPressed: () {
                // 处理搜索按钮点击事件
              },
            ),
            IconButton(
              icon: Icon(Icons.settings),
              onPressed: () {
                // 处理设置按钮点击事件
              },
            ),
          ],
        ),
        body: Center(
          child: Text('Hello, Metro AppBar!'),
        ),
      ),
    );
  }
}

自定义选项

MetroAppBar 提供了多种自定义选项,以下是一些常用的属性:

  • title: 应用栏的标题,通常是一个 Text 组件。
  • actions: 应用栏右侧的操作按钮列表,通常是一个 List<Widget>
  • leading: 应用栏左侧的组件,通常是一个 IconButton
  • backgroundColor: 应用栏的背景颜色。
  • elevation: 应用栏的阴影高度。
  • centerTitle: 是否将标题居中显示。

示例代码

以下是一个更复杂的示例,展示了如何使用 MetroAppBar 的各种自定义选项:

import 'package:flutter/material.dart';
import 'package:metro_appbar/metro_appbar.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Metro AppBar Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: MetroAppBar(
          title: Text('Metro AppBar Example'),
          leading: IconButton(
            icon: Icon(Icons.menu),
            onPressed: () {
              // 处理菜单按钮点击事件
            },
          ),
          actions: [
            IconButton(
              icon: Icon(Icons.search),
              onPressed: () {
                // 处理搜索按钮点击事件
              },
            ),
            IconButton(
              icon: Icon(Icons.settings),
              onPressed: () {
                // 处理设置按钮点击事件
              },
            ),
          ],
          backgroundColor: Colors.deepPurple,
          elevation: 4.0,
          centerTitle: true,
        ),
        body: Center(
          child: Text('Hello, Metro AppBar!'),
        ),
      ),
    );
  }
}
回到顶部