使用了一下flutter提供的导航栏,NavigationBar,不过感觉使用起来不是很方便。
譬如说:
- 不能直接使用图片资源,需要中间加几层转换把图片转化成icon
- 文本大小及颜色不太好控制
- 状态栏的上边来一个横线也没有相应的样式,等等。
因此想来想去还是自己写一个吧。
效果如下:
控件代码如下:
import 'package:flutter/material.dart';
import 'dart:developer' as developer;class XXNaviIcon {XXNaviIcon({required this.normalImage,required this.selectedImage,required this.title});final String selectedImage;final String normalImage;final String title;
}class XXNaviBar extends StatefulWidget {const XXNaviBar({super.key, required this.icons, this.onDestinationSelected}): currentIndex = 0;final List<XXNaviIcon> icons;final ValueChanged<int>? onDestinationSelected;final int currentIndex;State<XXNaviBar> createState() => _XXNaviBarState();
}class _XXNaviBarState extends State<XXNaviBar> {int currentIndex = 0;Widget build(BuildContext context) {return SafeArea(child: SizedBox(height: 48,child: Container(decoration: const BoxDecoration(border:Border(top: BorderSide(width: 0.5, color: Color(0xffbbbbbb)))),child: Row(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[for (int i = 0; i < widget.icons.length; i++)Expanded(child: GestureDetector(onTap: () => {developer.log("tap $i"),setState(() {currentIndex = i;}),if (widget.onDestinationSelected != null){widget.onDestinationSelected!(i)}},child: Container(color: Colors.white,child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Image.asset(currentIndex == i? widget.icons[i].selectedImage: widget.icons[i].normalImage,height: 24,),Text(widget.icons[i].title,style: const TextStyle(fontSize: 10, fontWeight: FontWeight.bold),),],),),))],),),));}
}
使用方式如下:
Widget build(BuildContext context) {return Scaffold(backgroundColor: Colors.white,bottomNavigationBar: XXNaviBar(onDestinationSelected: (value) => {developer.log("click tab $value"),if (currentPageIndex != value){setState(() {currentPageIndex = value;})}},icons: [XXNaviIcon(normalImage: "assets/images/tabbar/home.png",selectedImage: "assets/images/tabbar/home-selected.png",title: "首页",),XXNaviIcon(normalImage: "assets/images/tabbar/data.png",selectedImage: "assets/images/tabbar/data-selected.png",title: "数据",),XXNaviIcon(normalImage: "assets/images/tabbar/mine.png",selectedImage: "assets/images/tabbar/mine-selected.png",title: "我的",),],),body: <Widget>[Container(color: Colors.white,alignment: Alignment.center,child: const Text('Page 1'),),Container(color: Colors.white,alignment: Alignment.center,child: const Text('Page 2'),),Container(color: Colors.white,alignment: Alignment.center,child: const Text('Page 3'),),][currentPageIndex],);}
定制化可以根据自己的实际需求自行更改。