国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

Flutter 超實(shí)用簡(jiǎn)單菜單彈出框 PopupMenuButton功能

2019-11-19 11:04:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

相信在實(shí)際開(kāi)發(fā)過(guò)程當(dāng)中,肯定少不了這樣的功能:


點(diǎn)擊 AppBar 右上角的按鈕,彈出一個(gè)菜單供用戶選擇。

幸運(yùn)的是,F(xiàn)lutter 提供給我們了一個(gè) Widget,直接就能實(shí)現(xiàn)如上的效果。

PopupMenuButton

還是老規(guī)矩,先看官方的說(shuō)明:

Displays a menu when pressed and calls onSelected [1] when the menu is dismissed because an item was selected. The value passed to  onSelected [2] is the value of the selected menu item.

One of child [3] or  icon [4] may be provided, but not both. If  icon [5] is provided, then  PopupMenuButton [6] behaves like an  IconButton [7] .

If both are null, then a standard overflow icon is created (depending on the platform).

大致意思為:

當(dāng)按下的時(shí)候顯示一個(gè)菜單,選擇了一個(gè)項(xiàng)目的時(shí)候會(huì)回調(diào) onSelected ,傳遞的值是所選菜單的值。

可以提供 child or  icon ,但是不能同時(shí)提供。

如果為空,則提供一個(gè)默認(rèn)的圖標(biāo),取決于平臺(tái)。

構(gòu)造函數(shù)

看完了官方說(shuō)明,再來(lái)看構(gòu)造函數(shù):

const PopupMenuButton({ Key key, @required this.itemBuilder, this.initialValue, this.onSelected, this.onCanceled, this.tooltip, this.elevation = 8.0, this.padding = const EdgeInsets.all(8.0), this.child, this.icon, this.offset = Offset.zero, this.enabled = true,}) : assert(itemBuilder != null),assert(offset != null),assert(enabled != null),assert(!(child != null && icon != null)), // fails if passed both parameterssuper(key: key);

這里面每一個(gè)參數(shù)應(yīng)該都很好理解,就不做過(guò)多的解釋了,

唯一必傳的參數(shù)就是 itemBuilder ,也可以看到后面的斷言:

assert(!(child != null && icon != null)) 判斷了 child 、icon 是否同時(shí)不為空,如果是的話就報(bào)錯(cuò)了。

簡(jiǎn)單 Demo

構(gòu)造函數(shù)理解了,官方也提供了一個(gè) Demo,我們來(lái)看一下運(yùn)行效果:


再來(lái)看一下代碼:

/// 首先定義了一個(gè)枚舉enum WhyFarther { harder, smarter, selfStarter, tradingCharter,}/// ------------------------------------/// build 方法Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('PopupMenuButtonPage'), actions: <Widget>[ PopupMenuButton<WhyFarther>( onSelected: (WhyFarther result) { setState(() { _selection = result; }); }, icon: Icon(Icons.more_vert), itemBuilder: (BuildContext context) => <PopupMenuEntry<WhyFarther>>[ const PopupMenuItem<WhyFarther>( value: WhyFarther.harder, child: Text('Working a lot harder'), ), const PopupMenuItem<WhyFarther>( value: WhyFarther.smarter, child: Text('Being a lot smarter'), ), const PopupMenuItem<WhyFarther>( value: WhyFarther.selfStarter, child: Text('Being a self-starter'), ), const PopupMenuItem<WhyFarther>( value: WhyFarther.tradingCharter, child: Text('Placed in charge of trading charter'), ), ], ), ], ), body: Container(), );}

解釋一下邏輯:

1. 首先定義了一個(gè)枚舉

2. 然后在  AppBar  的「actions」里定義了  PopupMenuButton

3. 設(shè)置 icon 為  Icon(Icons.more_vert)

4. itemBuilder  需返回一個(gè)  List<PopupMenuEntry<T>>

5. 這里傳入的值就是  PopupMenuItem<WhyFarther>

6. 然后定義  onSelected  參數(shù)接收點(diǎn)擊回調(diào)

這樣整體的邏輯就是定義好了,運(yùn)行一下:

總結(jié)

這樣就完成了一個(gè)超級(jí)簡(jiǎn)單并且實(shí)用的菜單彈出框,

其實(shí)它的實(shí)現(xiàn)邏輯和 DropdownButton 差不多,都是使用了  PopupRoute ,

有對(duì)這方面感興趣的同學(xué),可以查看我以前寫(xiě)的文章: Flutter 源碼系列:DropdownButton 源碼淺析

完整代碼已經(jīng)傳至GitHub:https://github.com/wanglu1209/WFlutterDemo

References

[1] onSelected: https://api.flutter.dev/flutter/material/PopupMenuButton/onSelected.html
[2] onSelected: https://api.flutter.dev/flutter/material/PopupMenuButton/onSelected.html
[3] child: https://api.flutter.dev/flutter/material/PopupMenuButton/child.html
[4] icon: https://api.flutter.dev/flutter/material/PopupMenuButton/icon.html
[5] icon: https://api.flutter.dev/flutter/material/PopupMenuButton/icon.html
[6] PopupMenuButton: https://api.flutter.dev/flutter/material/PopupMenuButton-class.html
[7] IconButton: https://api.flutter.dev/flutter/material/IconButton-class.html

總結(jié)

以上所述是小編給大家介紹的Flutter 超實(shí)用簡(jiǎn)單菜單彈出框 PopupMenuButton功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)武林網(wǎng)網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 江油市| 温宿县| 台前县| 陆良县| 岚皋县| 玉龙| 田阳县| 澜沧| 东宁县| 九台市| 蒙城县| 潞西市| 德昌县| 沈阳市| 湘西| 虎林市| 临高县| 清河县| 四会市| 嘉义市| 呼伦贝尔市| 玉田县| 吉林市| 毕节市| 禄丰县| 乐山市| 汤阴县| 鹤岗市| 漾濞| 五莲县| 宁海县| 黄大仙区| 峨眉山市| 彭水| 宁国市| 哈尔滨市| 蕉岭县| 英德市| 阳泉市| 闽侯县| 香港 |