flutter TabBarList 自定义样式实现, AutomaticKeepAliveClientMixin每次切换页面不需要重新加载

TabBarList

import 'package:ZyFlutter/theme/font.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

/// 顶部tabBar
class TabBarList extends StatefulWidget {
  // 标题
  final Widget title;
  // 右侧功能区域
  final List<Widget> actions;
  // 左侧区域
  final Widget leading;
  // 内容区域
  final List<Widget> child;
  // tab列表
  final List<Tab> tabs;
  TabBarList(
      {Key key, this.title, this.actions, this.leading, this.child, this.tabs})
      : super(key: key);

  @override
  _TabBarListState createState() => _TabBarListState();
}

class _TabBarListState extends State<TabBarList>
    with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin {
  // Tab控制器
  TabController _tabController;
  int _tabIndex = 0;
  List<Tab> myTabs = [];

  // 初始化
  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: widget.tabs.length, vsync: this);
    setState(() {
      myTabs = widget.tabs;
    });
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: widget.leading,
        title: widget.title,
        actions: widget.actions,
        shadowColor: Colors.white,
        bottom: TabBar(
          indicator: BoxDecoration(
            border: Border(
              bottom: BorderSide(
                  color: Theme.of(context).toggleableActiveColor,
                  width: 3.sp,
                  style: BorderStyle.solid),
            ),
          ),
          tabs: myTabs,
          indicatorSize: TabBarIndicatorSize.label,
          labelStyle: TextStyle(
              color: Theme.of(context).colorScheme.primary,
              fontSize: Font.firstLevelTitle,
              fontWeight: FontWeight.bold),
          unselectedLabelStyle: TextStyle(
              color: Theme.of(context).colorScheme.primaryVariant,
              fontSize: Font.secondaryTitle),
          controller: _tabController,
        ),
      ),
      body: TabBarView(
        controller: _tabController,
        children: widget.child,
      ),
    );
  }

  @override
  bool get wantKeepAlive => true;
}

使用

import 'package:ZyFlutter/components/TabBarList.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:tapped/tapped.dart';

class Village extends StatefulWidget {
  @override
  _VillageState createState() => _VillageState();
}

class _VillageState extends State<Village> {
  List<Tab> list = [
    Tab(
      text: "精选",
    ),
    Tab(
      text: "本村",
    ),
    Tab(
      text: "关注",
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return TabBarList(
      tabs: list,
      title: Center(
        child: Text("村里"),
      ),
      child: [Text("123"), Text("999"), Text("123")],
      actions: [
        Padding(
          child: Tapped(
            child: Icon(
              Icons.camera_alt,
              color: Theme.of(context).colorScheme.primaryVariant,
            ),
          ),
          padding: EdgeInsets.only(right: 16.sp),
        )
      ],
    );
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值