Flutter自定义页面导航与包含标签栏视图插件contained_tab_bar_view_with_custom_page_navigator的使用

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

Flutter自定义页面导航与包含标签栏视图插件 contained_tab_bar_view_with_custom_page_navigator 的使用

ContainedTabBarView 是一个封装了 TabController, TabBarTabBarView 的 Widget,它简化了这些组件的使用,并提供了丰富的自定义选项。本文将介绍如何使用这个插件来创建自定义页面导航和标签栏视图。

基本用法

示例 1:基本示例

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

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

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Example1(),
    );
  }
}

class Example1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Example 1'),
      ),
      body: Center(
        child: Container(
          padding: const EdgeInsets.all(8.0),
          color: Colors.blue,
          width: 200,
          height: 300,
          child: ContainedTabBarView(
            tabs: [
              Text('First'),
              Text('Second'),
            ],
            views: [
              Container(color: Colors.red),
              Container(color: Colors.green)
            ],
            onChange: (index) => print(index),
          ),
        ),
      ),
    );
  }
}

在上面的例子中,我们创建了一个 ContainedTabBarView,它包含两个标签页(“First” 和 “Second”),每个标签页对应一个不同的颜色背景。

中级用法

自定义 TabBar 属性

可以通过 tabBarProperties 来设置 TabBar 的各种属性,如宽度、高度、背景等。

示例 5:自定义 TabBar 属性

class Example5 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Example 5'),
      ),
      body: Center(
        child: Container(
          height: 300,
          width: 360,
          child: ContainedTabBarView(
            tabs: [
              Text('First'),
              Text('Second'),
            ],
            tabBarProperties: TabBarProperties(
              width: 200,
              height: 32,
              background: Container(
                decoration: BoxDecoration(
                  color: Colors.blue,
                  borderRadius: BorderRadius.all(Radius.circular(8.0)),
                  boxShadow: [
                    BoxShadow(
                      color: Colors.black.withOpacity(0.4),
                      spreadRadius: 0.5,
                      blurRadius: 2,
                      offset: Offset(1, -1),
                    ),
                  ],
                ),
              ),
              position: TabBarPosition.bottom,
              alignment: TabBarAlignment.end,
              indicatorColor: Colors.transparent,
              labelColor: Colors.white,
              unselectedLabelColor: Colors.grey[400],
            ),
            views: [
              Container(color: Colors.red),
              Container(color: Colors.green)
            ],
            onChange: (index) => print(index),
          ),
        ),
      ),
    );
  }
}

在这个例子中,我们设置了 TabBar 的宽度、高度、背景、位置、对齐方式、指示器颜色、标签颜色等属性。

高级用法

从外部控件更改标签页

可以使用 GlobalKey 来控制 ContainedTabBarView 的状态,并通过 animateTo()next()previous() 方法来切换标签页。

示例 7:从外部控件更改标签页

class Example7 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    GlobalKey<ContainedTabBarViewState> _key = GlobalKey();
    ContainedTabBarView containedTabBarView = ContainedTabBarView(
      key: _key,
      tabs: [
        Text('First'),
        Text('Second'),
      ],
      views: [
        Container(color: Colors.red),
        Container(color: Colors.green),
      ],
      onChange: (index) => print(index),
    );

    return Scaffold(
      appBar: AppBar(
        title: Text('Example 7'),
      ),
      body: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: () => _key.currentState?.previous(),
            child: Icon(Icons.arrow_back_ios),
          ),
          Center(
            child: Container(
              padding: const EdgeInsets.all(8.0),
              color: Colors.blue,
              width: 200,
              height: 300,
              child: containedTabBarView,
            ),
          ),
          ElevatedButton(
            child: Icon(Icons.arrow_forward_ios),
            onPressed: () => _key.currentState?.next(),
          ),
        ],
      ),
    );
  }
}

在这个例子中,我们添加了两个按钮,分别用于切换到上一个和下一个标签页。

完整示例 Demo

以下是一个完整的示例,展示了如何使用 ContainedTabBarView 创建一个带有自定义导航和标签栏的应用程序:

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

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

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Custom Navigation with Tabs'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                Navigator.of(context).push(MaterialPageRoute(builder: (context) => Example1()));
              },
              child: Text('Example 1'),
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.of(context).push(MaterialPageRoute(builder: (context) => Example5()));
              },
              child: Text('Example 5'),
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.of(context).push(MaterialPageRoute(builder: (context) => Example7()));
              },
              child: Text('Example 7'),
            ),
          ],
        ),
      ),
    );
  }
}

// Example1, Example5, and Example7 are defined as above.

在这个完整的示例中,我们创建了一个主屏幕,其中包含三个按钮,每个按钮都可以导航到不同的示例页面。每个示例页面都使用了 ContainedTabBarView 来实现不同的功能和自定义效果。

通过这种方式,您可以轻松地在 Flutter 应用中实现自定义页面导航和标签栏视图。希望这些示例能够帮助您更好地理解和使用 contained_tab_bar_view 插件。


更多关于Flutter自定义页面导航与包含标签栏视图插件contained_tab_bar_view_with_custom_page_navigator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义页面导航与包含标签栏视图插件contained_tab_bar_view_with_custom_page_navigator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中实现自定义页面导航并结合使用contained_tab_bar_view插件的示例代码。假设你已经添加了contained_tab_bar_view到你的pubspec.yaml文件中,并且已经运行了flutter pub get

首先,确保你的pubspec.yaml中包含以下依赖:

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

然后,你可以创建一个包含自定义导航和标签栏视图的Flutter应用。以下是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Custom Navigation with ContainedTabBarView',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
  late TabController _tabController;
  int _selectedIndex = 0;

  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: 3, vsync: this);
  }

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  void _navigateToPage(int index) {
    setState(() {
      _selectedIndex = index;
      _tabController.index = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Custom Navigation with ContainedTabBarView'),
        bottom: TabBar(
          controller: _tabController,
          tabs: [
            Tab(icon: Icon(Icons.directions_car)),
            Tab(icon: Icon(Icons.directions_transit)),
            Tab(icon: Icon(Icons.directions_bike)),
          ],
        ),
      ),
      body: ContainedTabBarView(
        controller: _tabController,
        children: [
          CustomPage(title: 'Car'),
          CustomPage(title: 'Transit'),
          CustomPage(title: 'Bike'),
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: 'Home',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.search),
            label: 'Search',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.library_books),
            label: 'Library',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.person),
            label: 'Profile',
          ),
        ],
        currentIndex: _selectedIndex,
        onTap: _navigateToPage,
      ),
    );
  }
}

class CustomPage extends StatelessWidget {
  final String title;

  CustomPage({required this.title});

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(title),
    );
  }
}

解释

  1. 依赖管理:确保在pubspec.yaml文件中添加了contained_tab_bar_view依赖。

  2. 主应用MyApp是根Widget,包含MaterialAppMyHomePage

  3. 主页MyHomePage是一个StatefulWidget,它使用TabController来管理标签栏的状态。

  4. 自定义导航:通过BottomNavigationBar实现自定义导航,点击不同的项会调用_navigateToPage方法更新当前选中的页面索引和标签索引。

  5. 标签栏视图ContainedTabBarView用于显示与标签对应的页面。这里我们创建了三个简单的CustomPage,每个页面只显示一个标题。

  6. 页面内容CustomPage是一个简单的StatelessWidget,用于展示不同页面的内容。

这个示例展示了如何在Flutter应用中结合使用自定义底部导航和标签栏视图,通过ContainedTabBarView插件实现页面的切换。你可以根据实际需求进一步自定义和扩展这个示例。

回到顶部