找回密码
 加入怎通
查看: 227|回复: 4

Flutter 优雅的实现底部导航栏菜单(flutter web app)

[复制链接]
我来看看 发表于 2023-03-14 10:31:13 | 显示全部楼层 |阅读模式
' V4 T! r1 ^2 B% _! j. Q+ O

在业务开发中,开发者开发的业务中可能会用不到某一块的技术,但是小编建议,用不到的时候,可以顺便看看,当用到的时候就有足够的知识储备了,你可通会说,这会看了,时间长了就忘记了,小编要说的是,忘记不怕,你可以收藏或者关注我,当你忘记的时候,可以回来一看,小编会每周不定时更新内容每周必然会有更新,这是程序员的动力

& K2 L+ f- B2 E9 a5 N3 o

本文章实现的效果如下:

) i L0 d5 C s* U. o G

页面的主体是继承于StatefulWidgetStatefulWidget是一个可以更新页面显示样式的Widget,在Flutter开发中,如果未使用到状态管理框架如Getx这一类的内容,那么开发的所有的页面,只要涉及到页面中有数据更新,就需要使用StatefulWidget。

?3 b' Z1 C3 i5 M6 r

classNavaHomePage1extendsStatefulWidget{( L# r& U1 [* F. ?1 b3 m* ?/ e @overrideState createState(){ ) d5 J$ x( e% P$ j; i( h! L return _NavaHomePageState();4 x! t0 R R% a* s. } } # D5 e! ~0 ?4 \ } $ `) F' Q: c7 b! K/ L3 o. ^; X6 n 9 c1 Z- o3 e1 W& s/ v

* _( A2 I4 ], \4 {) `! T6 L9 q: B

class_NavaHomePageStateextendsState {& ~8 h A9 J+ Y* k ///当前显示的页面角标int _currentIndex = 0;0 x. b6 I. p$ W; B @override

9 ]+ e/ O1 Y. o* N

Widget build(BuildContext context){ + |' R* N% _' I" o. i! O# ]- o return Scaffold( Y% o' z& c" n) P2 w0 M2 K appBar: AppBar(, r+ l. [" f' r' b* [3 W title: Text("底部导航"

9 l" j, V0 f. ~* V

),2 V& M. k2 }' B: D! [0 k( K )," j+ z ]! |. w; N) V3 D+ i body: Text("这里是body $_currentIndex")," a. w4 c9 ^, t9 F' y4 L! q. T2 D //底部导航栏 5 s2 ?0 G7 q( H7 K; Y bottomNavigationBar: NavigationBar(% j! ?/ w c+ k% E& l

+ M; [: v. S( _% b5 z6 O

//菜单组 , d X% C: s" r& l8 C* B destinations: navigationList,4 [/ \6 P% w- z. Z/ m, T //当前选中的 @2 g7 o5 {* \; }/ U6 v selectedIndex:_currentIndex ,/ t- x' z* e2 d2 o1 ?2 k' v, E

/ {. a, z# M9 }; k+ @' x

//选择点击事件* E$ o1 R$ `" A, m2 \ onDestinationSelected: (int index){ x5 D6 T! O% T$ `7 @3 }: _ setState(() {% c1 d2 a: ~* Z, t# ] _currentIndex = index; 9 o& {1 d' c8 U `5 m });; e( B. Y3 Z: V- G) P },- `# Z# J2 U U/ L, ^/ i# o

" q% m2 ]# `; [9 L. j6 k; N! Z

//背景颜色# a- S- p9 f% ~7 A backgroundColor: Colors.white,7 q6 R# p/ }1 |& I //表面覆盖的一层浅色 ' S, Z/ `- f: u5 B- @! | surfaceTintColor: Colors.red,0 V2 m8 i# f) ^2 l ),7 D# i$ a' |" \7 p% M' ~ );9 }) _% A! M e+ a- R6 |4 H, H6 ^ } . T3 l: a. U6 z/ h ...# w, o+ X5 L. l( q4 ~1 R }

- W* q3 m9 E% O8 v

Scaffold 意为脚手架,在Flutter开发中,可以理解为页面的结构组件,一个空的页面,基本都是以Scaffold来布局Scaffold的属性appBar配置的是页面的顶部标题Scaffold的属性body配置的是页面中间显示的内容主体,在本实例中显示的是一个简单的文本,读者可以替换为对应的具体的实现页页面。

3 G0 B9 y0 e+ V. b/ C$ }

Scaffold的属性bottomNavigationBar配置的就是页面的底部的导航栏菜单,这里使用了NavigationBar,NavigationBar中destinations属性用来配置菜单选项,要求最少有两个子菜单选项,本实现中定义如下:

$ @1 t) ^5 ~2 z: j/ Z! u

staticconst List navigationList = [NavigationDestination(tooltip: "",icon: Icon(Icons.widgets_outlined),

5 _) H& O$ a* Z# W1 Z; @7 a9 {0 B

label: "菜单",selectedIcon: Icon(Icons.widgets),),NavigationDestination(tooltip: "",icon: Icon(Icons.file_open_outlined),

) |+ F; m( G3 h6 T# i

label: "发现",selectedIcon: Icon(Icons.file_open),),NavigationDestination(tooltip: "",icon: Icon(Icons.text_fields),

( ]6 A7 |' l1 w5 ^

label: "列表",selectedIcon: Icon(Icons.text_fields_outlined),),NavigationDestination(tooltip: "",icon:

% d# g: D; U( a& L) ^) n

Icon(Icons.people_alt_outlined),label: "我的",selectedIcon: Icon(Icons.people),)];小编的书籍,大家有兴趣可以阅读:(此处已添加书籍卡片,请到今日头条客户端查看)

% i& Z+ S& p, L8 Y( {! I& C" I * f9 E* |: _$ x# |( O! I' p- m- Z # Y5 F; g- V: r+ ~7 e 6 T* \% q9 p8 x! H3 K, }6 a 5 ` s4 u! ?& g, b

暂时无法加载帖子列表

回复

使用道具 举报

夜已深 发表于 2026-09-23 08:52:45 | 显示全部楼层
分析得很透彻,很多细节都说到点子上了~
回复

使用道具 举报

TC_酋长 发表于 2026-09-23 15:20:25 | 显示全部楼层
楼主辛苦了,整理这么多内容,必须点赞收藏
回复

使用道具 举报

zdgbyy 发表于 2026-09-26 16:07:27 | 显示全部楼层
这个思路很新颖,打开了新世界的大门,谢谢分享
回复

使用道具 举报

yoyomisscc 发表于 2026-09-29 00:26:44 | 显示全部楼层
这个分享太实用了,刚好能用到,感谢楼主!
回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-10-1 13:59 , Processed in 0.096519 second(s), 24 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表