Flutter无波纹效果标签栏插件flutter_tab_bar_no_ripple的使用

Flutter无波纹效果标签栏插件flutter_tab_bar_no_ripple的使用

TabBarNoRipple

仅包含标签栏的Flutter,不带波纹效果。

演示动图


如何使用

此部件与Flutter中的TabBar部件具有相同的API。 TabBar API

import 'package:flutter_tab_bar_no_ripple/flutter_tab_bar_no_ripple.dart';
TabBarNoRipple(
  controller: _controller,
  isScrollable: true,
  indicator: getIndicator(),
  tabs: _allPages.map<Tab>((_Page page) {
    assert(_demoStyle != null);
    switch (_demoStyle) {
      case TabsDemoStyle.iconsAndText:
        return Tab(text: page.text, icon: Icon(page.icon));
      case TabsDemoStyle.iconsOnly:
        return Tab(icon: Icon(page.icon));
      case TabsDemoStyle.textOnly:
        return Tab(text: page.text);
    }
    return null;
  }).toList(),
);

完整示例代码

以下是完整的示例代码,展示了如何使用flutter_tab_bar_no_ripple插件来创建一个无波纹效果的标签栏。

// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

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

enum TabsDemoStyle { iconsAndText, iconsOnly, textOnly }

void main() => runApp(App());

class _Page {
  const _Page({this.icon, this.text});
  final IconData icon;
  final String text;
}

class MaterialDemoDocumentationButton extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return IconButton(
        icon: const Icon(Icons.library_books),
        tooltip: 'API documentation',
        onPressed: () {});
  }
}

class App extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Title',
      home: ScrollableTabsDemo(),
    );
  }
}

const List<_Page> _allPages = [
  _Page(icon: Icons.grade, text: 'TRIUMPH'),
  _Page(icon: Icons.playlist_add, text: 'NOTE'),
  _Page(icon: Icons.check_circle, text: 'SUCCESS'),
  _Page(icon: Icons.question_answer, text: 'OVERSTATE'),
  _Page(icon: Icons.sentiment_very_satisfied, text: 'SATISFACTION'),
  _Page(icon: Icons.camera, text: 'APERTURE'),
  _Page(icon: Icons.assignment_late, text: 'WE MUST'),
  _Page(icon: Icons.assignment_turned_in, text: 'WE CAN'),
  _Page(icon: Icons.group, text: 'ALL'),
  _Page(icon: Icons.block, text: 'EXCEPT'),
  _Page(icon: Icons.sentiment_very_dissatisfied, text: 'CRYING'),
  _Page(icon: Icons.error, text: 'MISTAKE'),
  _Page(icon: Icons.loop, text: 'TRYING'),
  _Page(icon: Icons.cake, text: 'CAKE'),
];

class ScrollableTabsDemo extends StatefulWidget {
  static const String routeName = '/material/scrollable-tabs';

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

class ScrollableTabsDemoState extends State<ScrollableTabsDemo>
    with SingleTickerProviderStateMixin {
  TabController _controller;
  TabsDemoStyle _demoStyle = TabsDemoStyle.iconsAndText;
  bool _customIndicator = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller = TabController(vsync: this, length: _allPages.length);
  }

  [@override](/user/override)
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void changeDemoStyle(TabsDemoStyle style) {
    setState(() {
      _demoStyle = style;
    });
  }

  Decoration getIndicator() {
    if (!_customIndicator) return const UnderlineTabIndicator();

    switch (_demoStyle) {
      case TabsDemoStyle.iconsAndText:
        return ShapeDecoration(
          shape: const RoundedRectangleBorder(
                borderRadius: BorderRadius.all(Radius.circular(4.0)),
                side: BorderSide(
                  color: Colors.white24,
                  width: 2.0,
                ),
              ) +
              const RoundedRectangleBorder(
                borderRadius: BorderRadius.all(Radius.circular(4.0)),
                side: BorderSide(
                  color: Colors.transparent,
                  width: 4.0,
                ),
              ),
        );

      case TabsDemoStyle.iconsOnly:
        return ShapeDecoration(
          shape: const CircleBorder(
                side: BorderSide(
                  color: Colors.white24,
                  width: 4.0,
                ),
              ) +
              const CircleBorder(
                side: BorderSide(
                  color: Colors.transparent,
                  width: 4.0,
                ),
              ),
        );

      case TabsDemoStyle.textOnly:
        return ShapeDecoration(
          shape: const StadiumBorder(
                side: BorderSide(
                  color: Colors.white24,
                  width: 2.0,
                ),
              ) +
              const StadiumBorder(
                side: BorderSide(
                  color: Colors.transparent,
                  width: 4.0,
                ),
              ),
        );
    }
    return null;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    final Color iconColor = Theme.of(context).accentColor;
    return Scaffold(
      appBar: AppBar(
        title: const Text('Scrollable tabs'),
        actions: [
//          MaterialDemoDocumentationButton(ScrollableTabsDemo.routeName),
          IconButton(
            icon: const Icon(Icons.sentiment_very_satisfied),
            onPressed: () {
              setState(() {
                _customIndicator = !_customIndicator;
              });
            },
          ),
          PopupMenuButton<TabsDemoStyle>(
            onSelected: changeDemoStyle,
            itemBuilder: (BuildContext context) =>
                [
                  const PopupMenuItem<TabsDemoStyle>(
                      value: TabsDemoStyle.iconsAndText,
                      child: Text('Icons and text')),
                  const PopupMenuItem<TabsDemoStyle>(
                      value: TabsDemoStyle.iconsOnly,
                      child: Text('Icons only')),
                  const PopupMenuItem<TabsDemoStyle>(
                      value: TabsDemoStyle.textOnly, child: Text('Text only')),
                ],
          ),
        ],
        bottom: TabBarNoRipple(
          controller: _controller,
          isScrollable: true,
          indicator: getIndicator(),
          tabs: _allPages.map<Tab>((_Page page) {
            assert(_demoStyle != null);
            switch (_demoStyle) {
              case TabsDemoStyle.iconsAndText:
                return Tab(text: page.text, icon: Icon(page.icon));
              case TabsDemoStyle.iconsOnly:
                return Tab(icon: Icon(page.icon));
              case TabsDemoStyle.textOnly:
                return Tab(text: page.text);
            }
            return null;
          }).toList(),
        ),
      ),
      body: TabBarView(
          controller: _controller,
          children: _allPages.map<Widget>((_Page page) {
            return SafeArea(
              top: false,
              bottom: false,
              child: Container(
                key: ObjectKey(page.icon),
                padding: const EdgeInsets.all(12.0),
                child: Card(
                  child: Center(
                    child: Icon(
                      page.icon,
                      color: iconColor,
                      size: 128.0,
                      semanticLabel: 'Placeholder for ${page.text} tab',
                    ),
                  ),
                ),
              ),
            );
          }).toList()),
    );
  }
}

更多关于Flutter无波纹效果标签栏插件flutter_tab_bar_no_ripple的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter无波纹效果标签栏插件flutter_tab_bar_no_ripple的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_tab_bar_no_ripple 是一个 Flutter 插件,用于创建一个没有波纹效果的标签栏。这个插件可以帮助你在应用中创建一个自定义的标签栏,而不需要默认的 Material Design 波纹效果。

安装插件

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

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

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

使用 flutter_tab_bar_no_ripple

以下是一个简单的示例,展示如何使用 flutter_tab_bar_no_ripple 插件来创建一个没有波纹效果的标签栏。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DefaultTabController(
        length: 3,
        child: Scaffold(
          appBar: AppBar(
            title: Text('No Ripple TabBar Example'),
            bottom: PreferredSize(
              preferredSize: Size.fromHeight(48.0),
              child: TabBarNoRipple(
                tabs: [
                  Tab(text: 'Tab 1'),
                  Tab(text: 'Tab 2'),
                  Tab(text: 'Tab 3'),
                ],
              ),
            ),
          ),
          body: TabBarView(
            children: [
              Center(child: Text('Content of Tab 1')),
              Center(child: Text('Content of Tab 2')),
              Center(child: Text('Content of Tab 3')),
            ],
          ),
        ),
      ),
    );
  }
}

代码解释

  1. TabBarNoRipple: 这是 flutter_tab_bar_no_ripple 插件提供的主要组件,用于创建一个没有波纹效果的标签栏。你可以像使用普通的 TabBar 一样使用它。

  2. DefaultTabController: 这是一个控制器,用于管理标签栏和标签视图之间的同步。length 属性指定了标签的数量。

  3. TabBarView: 这是与 TabBar 关联的内容视图。每个标签对应一个 TabBarView 中的子项。

自定义样式

你可以通过 TabBarNoRippleindicatorColorlabelColor 等属性来自定义标签栏的样式:

TabBarNoRipple(
  indicatorColor: Colors.red,
  labelColor: Colors.blue,
  unselectedLabelColor: Colors.grey,
  tabs: [
    Tab(text: 'Tab 1'),
    Tab(text: 'Tab 2'),
    Tab(text: 'Tab 3'),
  ],
),
回到顶部