学习flutter过程中制作底部导航栏的写法
先上图

首页,备用,我的三个栏目切换

方法一(不带过度动画,IndexedStack方式)

import 'package:flutter/cupertino.dart';import 'package:flutter/material.dart';import 'package:flutter/services.dart';//引入3页import './car_page.dart';import './my_page.dart';import './index_page.dart';class HomePage extends StatefulWidget{    @override    _HomePageState createState() => _HomePageState();}class _HomePageState extends State<HomePage>{     //这是监听安卓的返回键操作    Future<bool> _onWillPop() {        return showDialog(            context: context,            builder: (context) => new AlertDialog(                title: new Text('退出App?'),                content: new Text('Do you want to exit an App'),                actions: <Widget>[                    new FlatButton(                        onPressed: () => Navigator.of(context).pop(false),                        child: new Text('不'),                    ),                    new FlatButton(                        onPressed: () async {                            await pop();                        },                        child: new Text('是的'),                    ),                ],            ),        ) ?? false;    }    static Future<void> pop() async {        await SystemChannels.platform.invokeMethod('SystemNavigator.pop');    }    final List<BottomNavigationBarItem> bottomTabs = [        BottomNavigationBarItem(            icon: Icon(CupertinoIcons.home),            title: Text("首页")        ),        BottomNavigationBarItem(            icon: Icon(CupertinoIcons.search),            title: Text("备用")        ),        BottomNavigationBarItem(            icon: Icon(CupertinoIcons.profile_circled),            title: Text("我的")        )    ];    final List<Widget> tabBodies = [        IndexPage(),        CarPage(),        MyPage(),    ];    int currentIndex = 0;    var currenPage;    @override    void initState(){        currenPage = tabBodies[currentIndex];        super.initState();    }    @override    Widget build(BuildContext context){        return WillPopScope(            onWillPop: _onWillPop,            child: Container(                child: Scaffold(                    bottomNavigationBar: BottomNavigationBar(                        type: BottomNavigationBarType.fixed,                        currentIndex: currentIndex,                        items: bottomTabs,                        onTap: (index){                            setState(() {                                currentIndex = index;                                currenPage = tabBodies[currentIndex];                            });                        },                    ),                    body: IndexedStack(                        index: currentIndex,                        children: tabBodies,                    ),                ),            )        );    }}

方法二(带过度动画,PageView方式)

import 'package:flutter/cupertino.dart';import 'package:flutter/material.dart';import 'package:flutter/services.dart';//引入3个切换的页面import './car_page.dart';import './my_page.dart';import './index_page.dart';class HomePage extends StatefulWidget{    @override    _HomePageState createState() => _HomePageState();}//要混入SingleTickerProviderStateMixinclass _HomePageState extends State<HomePage> with SingleTickerProviderStateMixin{    //这是监听安卓的返回键操作    Future<bool> _onWillPop() {        return showDialog(            context: context,            builder: (context) => new AlertDialog(                title: new Text('退出App?'),                content: new Text('Do you want to exit an App'),                actions: <Widget>[                    new FlatButton(                        onPressed: () => Navigator.of(context).pop(false),                        child: new Text('不'),                    ),                    new FlatButton(                        onPressed: () async {                            await pop();                        },                        child: new Text('是的'),                    ),                ],            ),        ) ?? false;    }    static Future<void> pop() async {        await SystemChannels.platform.invokeMethod('SystemNavigator.pop');    }    //建立下面三个按钮数组    final List<BottomNavigationBarItem> bottomTabs = [        BottomNavigationBarItem(            icon: Icon(CupertinoIcons.home),            title: Text("首页")        ),        BottomNavigationBarItem(            icon: Icon(CupertinoIcons.search),            title: Text("备用")        ),        BottomNavigationBarItem(            icon: Icon(CupertinoIcons.profile_circled),            title: Text("我的")        )    ];    //把3个页面排成数组形式方便切换    final List<Widget> tabBodies = [        IndexPage(),        CarPage(),        MyPage(),    ];    int currentIndex = 0;    //创建页面控制器    var _pageController;    @override    void initState(){        //页面控制器初始化        _pageController = new PageController(initialPage : 0);        super.initState();    }    @override    Widget build(BuildContext context){        //WillPopScope监听安卓返回键        return WillPopScope(            onWillPop: _onWillPop,            child: Container(                child: Scaffold(                    bottomNavigationBar: BottomNavigationBar(                        type: BottomNavigationBarType.fixed,                        currentIndex: currentIndex,                        items: bottomTabs,                        onTap: (index){                            setState(() {                                currentIndex = index;                            });                            //点击下面tabbar的时候执行动画跳转方法                            _pageController.animateToPage(index, duration: new Duration(milliseconds: 500),curve:new ElasticOutCurve(4));                        },                    ),                    body: PageView(                        controller: _pageController,                        children: tabBodies,                        onPageChanged: (index){                           currentIndex = index;                        },                    ),                ),            )        );     }}