顶部tabs切换:

    DefaultTabController 配置tabs 的控制器, length 是代表有几个子页面。

    注意: DefaultTabController 必须配合 Scaffold 使用, 它应该包裹 Scaffold 组件, 否则报错。

    1. import 'package:flutter/material.dart';
    2. class DetailPage extends StatelessWidget {
    3. DetailPage({this.arguments});
    4. final arguments;
    5. @override
    6. Widget build(BuildContext context) {
    7. // 最外层 DefaultTabController
    8. return DefaultTabController(
    9. length: 2,
    10. child: Scaffold(
    11. appBar: AppBar(
    12. title: Text('详情页面'),
    13. // TabBar 指定多少项
    14. bottom: TabBar(
    15. tabs: [
    16. Tab(text: '热门'),
    17. Tab(text: '推荐'),
    18. ],
    19. ),
    20. ),
    21. // TabBarView 用于展示 tabbar 的内容, 需要配置相等的length 子组件
    22. body: TabBarView(
    23. children: [
    24. Center(
    25. child: Column(
    26. children: [
    27. Text("详情页面${arguments != null ? arguments['id'] : '567'}"),
    28. ElevatedButton(
    29. onPressed: () {
    30. Navigator.pushNamed(context, '/me',
    31. arguments: {"id": 456});
    32. },
    33. child: Text('跳转到me页面'))
    34. ],
    35. ),
    36. ),
    37. Center(
    38. child: Column(
    39. children: [
    40. Text("详情页面第二个${arguments != null ? arguments['id'] : '567'}"),
    41. ElevatedButton(
    42. onPressed: () {
    43. Navigator.pushNamed(context, '/me',
    44. arguments: {"id": 456});
    45. },
    46. child: Text('跳转到me页面'))
    47. ],
    48. ),
    49. ),
    50. ],
    51. ),
    52. ));
    53. }
    54. }

    如果你不想要原生的 appbar , 只需要把tabbar 放在 appbar 的title 中:

    1. appBar: AppBar(
    2. automaticallyImplyLeading: false, //设置没有返回按钮
    3. // title: Text('详情页面'),
    4. title: TabBar(
    5. tabs: [
    6. Tab(text: '热门'),
    7. Tab(text: '推荐'),
    8. ],
    9. ),
    10. ),

    tabbar 的另外一种实现方式:

    1. import 'package:flutter/material.dart';
    2. // 必须继承 StatefulWidget
    3. class DetailPage extends StatefulWidget {
    4. final int arguments;
    5. DetailPage({Key key , this.arguments}) : super(key: key);
    6. @override
    7. _DetailPageState createState() => _DetailPageState();
    8. }
    9. // 首先要混入 这个 mixins SingleTickerProviderStateMixin
    10. class _DetailPageState extends State<DetailPage> with SingleTickerProviderStateMixin {
    11. TabController _tabController;
    12. // 重写 initState 生命周期
    13. @override
    14. void initState() {
    15. super.initState(); // 调用父类的方法
    16. _tabController = TabController(vsync: this, length: 2); // 实例化 TabController, 第一个固定参数,第二个是 tabs的长度
    17. _tabController.addListener(() {
    18. print(_tabController.index); // 如果没有重写 dispose ,这里会打印两次
    19. });
    20. }
    21. // 重写 dispose 生命周期(销毁)
    22. @override
    23. void dispose() {
    24. _tabController.dispose();
    25. super.dispose();
    26. }
    27. @override
    28. Widget build(BuildContext context) {
    29. return Scaffold(
    30. appBar: AppBar(
    31. bottom: TabBar(
    32. controller: _tabController,
    33. tabs: [
    34. Tab(text: '热销'),
    35. Tab(text: '推荐'),
    36. ],
    37. ),
    38. ),
    39. body: TabBarView(
    40. controller: _tabController,
    41. children: [
    42. Center(
    43. child: Text('热销'),
    44. ),
    45. Center(
    46. child: Text('推荐'),
    47. ),
    48. ],
    49. ),
    50. );
    51. }
    52. }