Flutter动态应用栏插件animated_appbar的使用

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

Flutter动态应用栏插件animated_appbar的使用

animated_appbar 是一个Flutter插件,允许你创建一个可以随着页面导航动态变化高度的应用栏。这个插件非常适合那些希望在页面切换时实现流畅动画效果的应用。

插件功能

  • 动态改变应用栏高度:在页面导航时,应用栏的高度可以根据需要动态调整。
  • 自定义应用栏内容:你可以根据需求自定义应用栏的内容,包括图标、文本等。
  • 平滑过渡动画:插件提供了平滑的过渡动画,确保用户在页面切换时有良好的视觉体验。

使用方法

要使用 animated_appbar 插件,你需要遵循以下步骤:

  1. 导入依赖: 在 pubspec.yaml 文件中添加 animated_appbar 依赖:

    dependencies:
      animated_appbar: ^最新版本号
    
  2. 创建主应用程序: 你需要使用 BaseLayoutAnimatedAppBar 来构建你的应用。BaseLayoutanimated_appbar 插件提供的一个基础布局组件,必须使用它来包裹你的页面。

  3. 设置初始页面和应用栏: 在 BaseLayout 中,你可以通过 appBar 属性设置初始的应用栏,并通过 scaffold 属性设置初始页面。

  4. 页面导航: 当你从一个页面导航到另一个页面时,可以使用 routePageroutePageWithNewAppBar 方法。如果你想要在新页面中显示不同的应用栏,可以使用 routePageWithNewAppBar 方法并传递一个新的应用栏小部件。

  5. 返回上一页: 使用 previousPage() 方法可以返回到上一个页面,并自动恢复之前的应用栏状态。

完整示例代码

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

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      // 必须使用 BaseLayout 来包裹整个应用
      home: BaseLayout(
        // 设置初始应用栏
        appBar: AnimatedAppBar(
          initHeight: 135.0, // 初始应用栏高度
          backgroundColor: Color(0xff7a7ad1), // 应用栏背景颜色
          child: Container(
            key: UniqueKey(), // 必须设置唯一的 key,以确保动画效果
            child: Center(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  Icon(
                    Icons.apps,
                    color: Colors.white,
                    size: 20.0,
                  ),
                  Text(
                    "You can customise this Area",
                    style: TextStyle(
                      color: Colors.white,
                      fontSize: 20.0,
                    ),
                  ),
                  Icon(
                    Icons.manage_search,
                    color: Colors.white,
                    size: 20.0,
                  ),
                ],
              ),
            ),
          ),
        ),
        // 设置初始页面为 Page1
        scaffold: Page1(),
      ),
    );
  }
}

// Page1 页面
class Page1 extends StatelessWidget with RoutePage {
  // 定义 Page2 的新应用栏
  Widget newAppBar = Container(
    key: UniqueKey(), // 必须设置唯一的 key,以确保动画效果
    child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text(
          "AppBar changed!!",
          style: TextStyle(
            color: Color(0xfff7f4cc),
            fontSize: 20,
          ),
        ),
        Text(
          "You can customise here too..🔥",
          style: TextStyle(
            color: Color(0xfff7f4cc),
            fontSize: 20,
          ),
        ),
      ],
    ),
  );

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              "Page 1 😄",
              style: TextStyle(fontSize: 50),
            ),
            SizedBox(height: 5),
            Container(
              decoration: BoxDecoration(
                color: Colors.blue,
                borderRadius: BorderRadius.all(Radius.circular(8)),
              ),
              padding: EdgeInsets.all(10.0),
              child: TextButton(
                // 导航到 Page2 并设置新的应用栏
                onPressed: () => routePageWithNewAppBar(Page2(), newAppBar),
                child: Text(
                  "Click here to navigate Page2!",
                  style: TextStyle(fontSize: 20, color: Colors.white),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

// Page2 页面
class Page2 extends StatelessWidget with RoutePage {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              "Page 2 🚩",
              style: TextStyle(fontSize: 50),
            ),
            SizedBox(height: 5),
            Container(
              decoration: BoxDecoration(
                color: Colors.red,
                borderRadius: BorderRadius.all(Radius.circular(8)),
              ),
              padding: EdgeInsets.all(10.0),
              child: TextButton(
                // 返回到 Page1
                onPressed: () => previousPage(),
                child: Text(
                  "back to Page1",
                  style: TextStyle(fontSize: 20, color: Colors.white),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter中使用animated_appbar插件来实现动态应用栏的一个示例。animated_appbar 插件允许你在滚动内容时动态地改变应用栏的外观,例如改变其标题、颜色或透明度。

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

dependencies:
  flutter:
    sdk: flutter
  animated_appbar: ^0.2.0  # 请确保使用最新版本

然后运行flutter pub get来获取依赖。

接下来是一个简单的示例代码,展示如何使用animated_appbar

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Animated AppBar Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
  final List<String> items = List<String>.generate(50, (i) => "Item $i");

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: AnimatedAppBar(
        appBar: AppBar(
          title: Text("Animated AppBar Demo"),
          centerTitle: true,
          backgroundColor: Colors.blue,
        ),
        flexibleSpace: FlexibleSpaceBar(
          background: Image.network(
            'https://via.placeholder.com/1500x500',
            fit: BoxFit.cover,
          ),
        ),
        statusBarColor: Colors.transparent,
        bottom: ListView.builder(
          itemCount: items.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(items[index]),
            );
          },
        ),
        animationDuration: Duration(milliseconds: 300),
      ),
    );
  }
}

代码解释:

  1. 依赖添加:在pubspec.yaml文件中添加animated_appbar依赖。
  2. MyApp:定义了应用的基本结构,包括主题和主页。
  3. MyHomePage:包含状态管理(StatefulWidget),用于处理列表数据的显示。
  4. _MyHomePageState
    • 使用AnimatedAppBar组件。
    • appBar参数定义了静态的AppBar外观。
    • flexibleSpace参数定义了一个背景图片(在滚动时这个背景图片会逐渐消失)。
    • statusBarColor参数设置了状态栏的颜色(这里设置为透明)。
    • bottom参数定义了列表视图,使用ListView.builder来构建。
    • animationDuration参数定义了动画的持续时间。

这个示例展示了如何使用animated_appbar插件来创建一个带有动态效果的AppBar,当用户滚动内容时,背景图片会逐渐消失,同时AppBar可能会根据需要进行其他动态变化。你可以根据具体需求进一步自定义这些参数和效果。

回到顶部