Flutter Netflix风格应用栏插件netflix_appbar的使用

Flutter Netflix风格应用栏插件netflix_appbar的使用

Dremar Design

WATCH THE VIDEO EXAMPLE

该插件将允许你模拟Netflix应用菜单的行为。

我创建的类只是一个简单的模仿,因此在较旧设备上可能会出现堆栈内存问题或图形性能问题。

如何使用它

为了使用此插件,你需要安装page_transition(至少版本1.0.0)和after_layout(至少版本1.0.5)。

导入后,你应该创建你自己的个性化状态或无状态小部件类。在你的默认main函数中,你需要创建一个对象列表并返回NetflixAppBar实例。

对象列表

让我们创建一个简单的对象列表:

// 初始化列表
List<DrTextTransitionTitleObject> titles = new List();

// 添加一个新的Widget类,这是你创建的一个
titles.add(new DrTextTransitionTitleObject("title", "slug", your_class_name()));

NetflixAppBar 参数

NetflixAppBar(List<DrTextTransitionTitleObject> titles, int duration,
    {Widget header,
    double headerHeight = 0,
    Color background = Colors.transparent,
    Color appBarColor,
    int dumping = 100,
    double titlePaddingLeft = 16,
    double titlePaddingRight = 15,
    double titleActiveFontSize = 20,
    double maxOpacity = 0.6,
    double initialOpacity = 0,
    bool pinned = false,
    TextStyle titleStyles = const TextStyle(
        color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold),
    Widget leading,
    Function(ScrollController, String, NetflixAppBar) onScreenChange,
    MainAxisAlignment mainAxisAlignment})

参数说明

参数名 类型 描述 默认值
titles List 你最初创建的对象列表 null
duration int 菜单动画的持续时间(以毫秒为单位) null
header Widget 应用栏头部,它是可选的 null
headerHeight double 应用栏头部高度 0
background Color Scaffold的基本颜色,NetflixToolbar返回的颜色 Colors.transparent
appBarColor Color 应用栏的主要颜色 Colors.purpleAccent.withOpacity(0.7)
dumping int 值越大用户需要滚动更多才能使应用栏消失 100
titleStyles TextStyle 要设置给菜单标题的样式 const TextStyle(
color: Colors.white,
fontSize: 16,
fontWeight: FontWeight.bold)
titlePaddingLeft double 标题行应具有的左边距 16
titlePaddingRight double 标题行应具有的右边距 15
titleActiveFontSize double 标题标签在过渡期间的字体大小 20
leading Widget 应用栏的前导小部件 null
pinned bool 如果你想让应用栏始终固定在顶部,请将pinned设为true false
initialOpacity double 应用栏的初始和最小不透明度 0
maxOpacity double 用户向下滚动时应用栏能达到的最大不透明度。应用栏不透明度将遵循你设置的dumping值 0.6
onScreenChange Function 一个允许你获取当前屏幕控制权的函数 null
mainAxisAlignment MainAxisAlignment 应用栏标题行的主轴对齐方式 MainAxisAlignment.spaceBetween 当标题长度 > 2; MainAxisAlignment.start 当标题长度 <= 2

示例

List<DrTextTransitionTitleObject> titles = new List();

titles.add(new DrTextTransitionTitleObject("Movies", "movies", Movies()));
titles.add(new DrTextTransitionTitleObject("Tv Series", "tv", Tv()));
titles.add(new DrTextTransitionTitleObject("About Me", "about", AboutUs()));

int milliseconds = 700;

TextStyle titleStyles = const TextStyle(
    fontFamily: "Dr1",
    color: Colors.white,
    fontSize: 18,
    fontWeight: FontWeight.bold);

instance = NetflixAppBar(
  titles,
  milliseconds,
  initialOpacity: 0.3,
  maxOpacity: 1,
  dumping: 100,
  titleStyles: titleStyles,
  titleActiveFontSize: 21,
  appBarColor: Colors.black,
  background: Colors.black,
  onScreenChange:
      (ScrollController controller, String slug, NetflixAppBar instance) {
    print("Controller received correctly \n We are on $slug screen");
    this.currentSlug = slug;
    this.instance = NetflixAppBar.getInstance();
    var newTitles = this.instance.titles;

    // ...

  },
);
return instance;

重要提示

在第一次屏幕切换之后,包装NetflixAppBar实例的类将被处置,所以请注意。

静态函数

getInstance()

NetflixAppBar.getInstance() 将返回当前的NetflixAppBar实例。这样你就可以获取有关当前标题、属性等信息。

getContext()

NetflixAppBar.getContext() 将返回当前NetflixAppBar实例的上下文。

notify()

NetflixAppBar.notify() 将允许你更新当前显示屏幕上图形元素。

goBack()

NetflixAppBar.goBack() 将允许你返回到上一个屏幕。

DrTextTransitionTitleObject 参数

DrTextTransitionTitleObject(String name, String heroTag, Widget function,
      {List<DrTextTransitionTitleObject> newTitles,
      bool personalized = false,
      Widget overrideWidget,
      Function overrideAction,
      TextStyle primaryStyle,
      Widget header,
      double headerHeight,
      double paddingLeft = 0})

参数说明

参数名 类型 描述 默认值
name String 标题值 null
heroTag String 这是标签slug,它允许应用程序将其用作Hero Widget标签进行动画处理 null
function Widget 这是你想让用户点击标签时显示的小部件。如果你设置了overrideAction函数,你可以将function属性设置为null null
newTitles List 当用户点击特定标题时要显示的标题列表 null
personalized bool 如果设置为true,则表示你想为此标题创建自己的小部件。默认小部件是一个动画文本视图 false
overrideWidget Widget 如果personalizedtrue,你必须指定一个overrideWidget。这是Flutter将为此标题显示的小部件 null
overrideAction Function 当用户点击菜单上的此标题时触发的个性化函数 null
primaryStyle TextStyle 要给予默认TextView小部件的样式,该小部件显示应用栏上的标题名称 null
paddingLeft double 要给予默认TextView小部件的左边距 0
header Widget 当用户点击标题且未设置overrideAction时,这将是出现在应用栏顶部的新小部件 null
headerHeight double header widget的高度 null

示例

List<DrTextTransitionTitleObject> titles = new List();
List<DrTextTransitionTitleObject> tvTitles = new List();

var movies = new Movies();
var tv = new Tv();

titles.add(new DrTextTransitionTitleObject("Movies", "movies", movies,
    header: switchHeader("movies")));
titles.add(new DrTextTransitionTitleObject("Tv Series", "tv", tv,
    newTitles: tvTitles, header: switchHeader("movies")));
titles.add(new DrTextTransitionTitleObject("About Me", "about", AboutUs()));

tvTitles.add(new DrTextTransitionTitleObject("Tv Series", "tv", tv,
    newTitles: titles,
    header: switchHeader("tv"),
    personalized: true,
    overrideWidget: Icon(
      Icons.search,
      color: Colors.white,
      size: 32,
    )));
tvTitles.add(new DrTextTransitionTitleObject("Movies", "movies", movies,
    newTitles: titles, paddingLeft: 35));

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

1 回复

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


当然,以下是如何在Flutter应用中使用netflix_appbar插件来实现Netflix风格的应用栏的一个代码示例。首先,你需要确保你的Flutter项目已经包含了netflix_appbar插件。你可以通过在你的pubspec.yaml文件中添加以下依赖项来实现这一点:

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

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

一旦安装完成,你可以在你的Flutter应用中使用NetflixAppBar组件。以下是一个简单的示例代码,展示了如何使用netflix_appbar来创建一个Netflix风格的应用栏:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Netflix AppBar Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: PreferredSize(
          preferredSize: Size.fromHeight(kToolbarHeight + 40.0), // 调整高度以适应Netflix风格
          child: NetflixAppBar(
            title: Text('Netflix Clone'),
            backgroundColor: Colors.black,
            leading: IconButton(
              icon: Icon(Icons.menu, color: Colors.white),
              onPressed: () {},
            ),
            actions: <Widget>[
              IconButton(
                icon: Icon(Icons.search, color: Colors.white),
                onPressed: () {},
              ),
              IconButton(
                icon: Icon(Icons.more_vert, color: Colors.white),
                onPressed: () {},
              ),
            ],
            bottom: TabBar(
              indicatorColor: Colors.transparent,
              tabs: [
                Tab(icon: Icon(Icons.home, color: Colors.white)),
                Tab(icon: Icon(Icons.trending_up, color: Colors.white)),
                Tab(icon: Icon(Icons.library_books, color: Colors.white)),
              ],
            ),
          ),
        ),
        body: TabBarView(
          children: [
            Center(child: Text('Home Tab')),
            Center(child: Text('Trending Tab')),
            Center(child: Text('My List Tab')),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 引入必要的包:首先,我们导入了flutter/material.dartnetflix_appbar/netflix_appbar.dart

  2. 创建MyApp:这是我们的主应用类,它扩展了StatelessWidget

  3. 设置MaterialApp:在MyAppbuild方法中,我们创建了一个MaterialApp,它包含了我们的应用的主题和主页。

  4. 创建Scaffold:在主页中,我们使用了Scaffold来构建我们的页面布局。

  5. 使用PreferredSize包装NetflixAppBar:由于NetflixAppBar的高度不是标准的AppBar高度,我们使用PreferredSize来指定它的大小。

  6. 配置NetflixAppBar:我们设置了标题、背景颜色、leading图标(菜单按钮)、actions图标(搜索和更多按钮)以及底部的TabBar

  7. 使用TabBarView:在Scaffoldbody中,我们使用TabBarView来显示与TabBar中的标签相对应的视图。

这个示例提供了一个基本的Netflix风格的应用栏,你可以根据需要进一步自定义和扩展它。

回到顶部