找回密码
 加入怎通
查看: 192|回复: 0

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

[复制链接]
我来看看 发表于 2023-03-14 10:31:13 | 显示全部楼层 |阅读模式
4 B% I# M& |; H' T( K

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

/ O$ P+ G1 R# X; q6 U- H( j

本文章实现的效果如下:

% p5 f' y. r2 z; [% l5 @7 q

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

% y$ F/ Z7 @" _& ]/ P: a

classNavaHomePage1extendsStatefulWidget{ . o( X+ y; K$ k/ w- ~ @overrideState createState(){ 9 `1 E5 [! a7 l: b8 z return _NavaHomePageState();( N* z4 _0 w2 k" Y: \' V }1 }/ G; Z2 h3 @ }, R0 s8 w; _+ K1 P" S- e+ i 5 e& Q. W7 d+ S! M! O _+ `- y

6 d% \9 s m: \+ b

class_NavaHomePageStateextendsState { * n: z/ m. m6 r0 H0 a: J! d ///当前显示的页面角标int _currentIndex = 0;* x e- N! N/ A$ m @override

' M3 C3 G# K1 q. S# Z

Widget build(BuildContext context){ 1 [; g; C! R/ e4 V+ W return Scaffold( 5 C8 }4 z( g p$ _9 C+ ` appBar: AppBar(; t+ Q7 ^' {+ [! P% [" }6 H* E title: Text("底部导航"

' ^ w" g' ^1 T. a% X- W; f) e4 U

), % @2 u7 v2 r( |8 S9 y' g ), 3 K! c$ Y. u8 d1 |. S% D; E$ f- s body: Text("这里是body $_currentIndex"), / R+ {5 Y* Q$ S4 g //底部导航栏% s8 }- |4 c* X" j" f5 ?! Q2 l bottomNavigationBar: NavigationBar( 7 I% _! J: p* d8 y) d

& ?+ n6 @. X/ @% |

//菜单组- q+ D6 v7 x* f! s% c# C destinations: navigationList,# i2 m# G7 P2 F L# r0 j //当前选中的 " ~. c! p# K4 ~8 t- p, a( ^' Q" ^ selectedIndex:_currentIndex , . A& U& p* `# G

( l. q$ `3 K) _9 x" t! q; R

//选择点击事件 . }- f7 H P, {$ S5 b% W onDestinationSelected: (int index){ ; B# S f6 ]2 u5 Z* C( d9 r setState(() {/ x j6 W8 \9 W% |6 k6 I _currentIndex = index; v- }3 ?: K8 I6 K# j/ `: F" b });- _! L' f- t; k+ ]/ [9 d1 I },; q9 L Q x4 f: x, X: O

7 Q5 Y& w5 ?6 a6 W+ @% x

//背景颜色 ! [" O( E' z6 g# D5 D backgroundColor: Colors.white,8 [, |4 x) F5 ]0 E3 g8 a. T+ U$ \0 a //表面覆盖的一层浅色 * A' r0 k1 k3 D surfaceTintColor: Colors.red, + U. g9 R# h5 S9 v; ^ ), & H6 y; L' n0 P* o# F );. E3 I% E+ Q: F2 W% M' U; _ } ' R! n* z T# {& t1 L0 \ ... K$ u$ O- E" J* { }

; p0 ` {3 v: t0 i. `, f' N0 [

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

" S( l2 q) c, s2 R& ^

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

, F/ [/ d: p& }' T+ m* p; z

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

@; f2 R4 b3 e7 d( L

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

8 J1 Q2 `0 C9 k" p

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

' }' g7 j- c$ I- U6 f a

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

1 L/ m f0 N1 ^1 Z5 l

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

$ E' z! T7 e6 M4 h" ]( s3 N% n R( t9 E u! q: f( m( d$ e4 H. g6 F ; u# h9 d9 p" G9 l4 O. Y $ g# V5 A: j& g, U' [ ) j! b6 a# @ g1 x3 ~$ V1 f
回复

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-7-8 18:25 , Processed in 0.066799 second(s), 24 queries , Gzip On.

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

    Powered by Discuz! X3.5

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