Flutter 74: 圖解基本 DropdownButton 下拉選
和尚對於 Flutter 並不系統,總是遇到問題才會準備嘗試,今天和尚準備學習一下下拉選擇框;Android 提供了便利的 Spinner 而 Flutter 對應的是 DropdownButton;
原始碼分析
DropdownButton({
Key key,
@required this.items, // 下拉選項列表
this.selectedItemBuilder, // 選項 item 構造器
this.value, // 選中內容
this.hint, // 啟動狀態下預設內容
this.disabledHint, // 禁用狀態下預設內容
@required this.onChanged, // 選擇 item 回撥
this.elevation = 8, // 陰影高度
this.style, // 選項列表 item 樣式
this.underline, // 按鈕下劃線
this.icon, // 下拉按鈕圖示
this.iconDisabledColor, // 禁用狀態下圖示顏色
this.iconEnabledColor, // 啟動時圖示顏色
this.iconSize = 24.0, // 圖示尺寸
this.isDense = false, // 是否降低按鈕高度
this.isExpanded = false, // 是否將下拉選單內容設定水平填充
})
const DropdownMenuItem({
Key key,
this.value, // 對應選中狀態內容
@required this.child, // 下拉選單 item 內容
})
分析原始碼可知,items 和 onChanged 回撥是必須引數,且在不同狀態下,展示的效果不同;其中 items 或 onChanged 為 null 時為禁用狀態,和尚接下來逐一分析各屬性;
案例分析
- items 為下拉選項列表,onChanged 為選中回撥;兩者其中一個為 null 時為按鈕禁用狀態,不可點選,預設下拉 icon 為灰色;items 不為空時,需為相同型別的 DropdownMenuItem 型別列表;
DropdownButton(items: null, onChanged: null);
DropdownButton(items: [
DropdownMenuItem(child: Text('北京')),
DropdownMenuItem(child: Text('天津')),
DropdownMenuItem(child: Text('河北'))
], onChanged: (value) {});
- icon 為下拉按鈕右側圖示,iconSize 為下拉按鈕圖示尺寸,禁用和啟動狀態下均可設定;若 icon 設定尺寸以 icon 尺寸為準;
icon: Icon(Icons.arrow_right),
// icon: Icon(Icons.arrow_right, color: Colors.blue.withOpacity(0.7), size: 60),
iconSize: 40,
- iconDisabledColor 為禁用狀態下設定 icon 顏色,iconEnabledColor 為按鈕啟用狀態下設定 icon 顏色;但若 icon 設定固定顏色後,以 icon 設定為準;
// 禁用 icon 顏色
iconDisabledColor: Colors.redAccent.withOpacity(0.7),
// 啟用 icon 顏色
iconEnabledColor: Colors.green.withOpacity(0.7),
4. disabledHint 為禁用狀態下預設展示內容,hint 為按鈕啟用狀態下預設展示內容,採用 hint 時 DropdownMenuItem 中 type 不為空,否則只會顯示第一條 item;
// 禁用預設內容
disabledHint: Text('暫不可用'),
// 啟用預設內容
DropdownButton(icon: Icon(Icons.arrow_right), iconSize: 40, iconEnabledColor: Colors.green.withOpacity(0.7),
hint: Text('請選擇地區'),
items: [
DropdownMenuItem(child: Text('北京'), value: 1), DropdownMenuItem(child: Text('天津'), value: 2),
DropdownMenuItem(child: Text('河北'), value: 3)
], onChanged: (value) {});
5. underline 用來設定按鈕下劃線樣式,若設定 null 顯示的是高度為 1.0 的預設下劃線樣式,若需要隱藏下劃線可以設定 Container 高度為 0.0;
underline: Container(height: 4, color: Colors.green.withOpacity(0.7)),
// 隱藏下劃線
underline: Container(height: 0),
- isDense 用來調整按鈕高度,true 時將按鈕高度縮小,縮小的高度透過 Theme _kDenseButtonHeight 決定,但不會縮小太多導致圖示剪下;
// 原始碼
double get _denseButtonHeight {
final double fontSize = _textStyle.fontSize ?? Theme.of(context).textTheme.subhead.fontSize;
return math.max(fontSize, math.max(widget.iconSize, _kDenseButtonHeight));
}
- isExpanded 用於是否填充按鈕寬度到父控制元件,true 為填充,false 為預設不填充;
// 原始碼
if (widget.isExpanded)
Expanded(child: innerItemsWidget)
- elevation 是 z 軸上垂直陰影,只能是 1 / 2 / 3 / 4 / 6 / 8 / 9 / 12 / 16 / 24,預設陰影高度是 8,若設定其他值不顯示;
//原始碼
8: <BoxShadow>[
BoxShadow(offset: Offset(0.0, 5.0), blurRadius: 5.0, spreadRadius: -3.0, color: _kKeyUmbraOpacity),
BoxShadow(offset: Offset(0.0, 8.0), blurRadius: 10.0, spreadRadius: 1.0, color: _kKeyPenumbraOpacity),
BoxShadow(offset: Offset(0.0, 3.0), blurRadius: 14.0, spreadRadius: 2.0, color: _kAmbientShadowOpacity),
],
- style 為下拉選項列表中文字樣式;但下拉選單 item 設定文字樣式後,以 item 設定為準;
DropdownButton(style: style,
icon: Icon(Icons.arrow_right), iconSize: 40, iconEnabledColor: Colors.green.withOpacity(0.7),
hint: Text('請選擇地區'), isExpanded: true, underline: Container(height: 1, color: Colors.green.withOpacity(0.7)),
items: [
DropdownMenuItem(
child: Row(children: <Widget>[Text('北京'), SizedBox(width: 10), Icon(Icons.ac_unit) ]),
value: 1),
DropdownMenuItem(
child: Row(children: <Widget>[Text('天津'), SizedBox(width: 10), Icon(Icons.content_paste) ]),
value: 2),
DropdownMenuItem(
child: Row(children: <Widget>[Text('河北', style: TextStyle(color: Colors.purpleAccent, fontSize: 16)), SizedBox(width: 10), Icon(Icons.send, color: Colors.purpleAccent) ]),
value: 3)
],
onChanged:(value) {});
- 對於 DropdownButton 選中回撥,其中 items 中 value 是必須引數,且不相同;回撥返回的內容是 DropdownMenuItem 中 child 內容;
DropdownButton(
value: _value, style: style,
icon: Icon(Icons.arrow_right), iconSize: 40, iconEnabledColor: Colors.green.withOpacity(0.7),
hint: Text('請選擇地區'), isExpanded: true, underline: Container(height: 1, color: Colors.green.withOpacity(0.7)),
items: [
DropdownMenuItem(
child: Row(children: <Widget>[Text('北京'), SizedBox(width: 10), Icon(Icons.ac_unit) ]),
value: 1),
DropdownMenuItem(
child: Row(children: <Widget>[Text('天津'), SizedBox(width: 10), Icon(Icons.content_paste) ]),
value: 2),
DropdownMenuItem(
child: Row(children: <Widget>[Text('河北', style: TextStyle(color: Colors.purpleAccent, fontSize: 16)), SizedBox(width: 10), Icon(Icons.send, color: Colors.purpleAccent) ]),
value: 3)
],
onChanged: (value) => setState(() => _value = value));
和尚對 DropdownButton 的嘗試僅限於基本屬性的應用,對於使用 PopupRoute 浮層展示 DropdownMenuItem 列表的原始碼層涉及較少;如有錯誤請多多指導!
來源: 阿策小和尚
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2041/viewspace-2824761/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Flutter 專題】74 圖解基本 DropdownButton 下拉選項框按鈕|8月更文挑戰Flutter圖解
- Flutter基礎-042-DropDownButton下拉選單Flutter
- Flutter 原始碼系列:DropdownButton 原始碼淺析Flutter原始碼
- 【Flutter 專題】104 圖解自定義 ACEDropdownButton 下拉框Flutter圖解
- Bootstrap系列 -- 24. 下拉選單基本用法boot
- Flutter 自定義功能強大的下拉篩選選單 packageFlutterPackage
- 【Flutter 專題】96 圖解 Draggable + DragTarget 基本拖拽效果Flutter圖解
- 【Flutter 專題】89 圖解基本 Overlay 懸浮新手引導Flutter圖解
- JavaScript二級下拉選單詳解JavaScript
- 下拉選單
- 模擬select下拉選單詳解
- CSS三級下拉導航選單詳解CSS
- JavaScript下拉摺疊導航選單講解JavaScript
- jquery二級下拉導航選單詳解jQuery
- vue下拉選單Vue
- html - 下拉選單HTML
- Spinner下拉選單
- Flutter 58: 圖解 Flutter 嵌入原生 AndroidFlutter圖解Android
- 下拉選單「點選外面關閉」的終極解決方案
- 【Flutter 專題】69 圖解基本 Stepper 步進器|8月更文挑戰Flutter圖解
- 【Flutter 專題】68 圖解基本約束 Box (三)|8月更文挑戰Flutter圖解
- 【Flutter 專題】67 圖解基本約束 Box (二)|8月更文挑戰Flutter圖解
- 乾貨]TI公司TTL/CMOS/LVTTL,74LS/74S/74ALS/74AS/74F/74HC/74HCT/74AC/74ACT/74BCT/74ABT/74LV/74LVC/74LV區別與對比
- 二級下拉導航選單製作詳解
- Flutter 圖片選擇器 SelectPhotoWidgetFlutter
- Vue.js自定義下拉選單,如何實現在下拉選單區域外點選即可關閉下拉選單的功能Vue.js
- Bootstrap下拉選單disabledboot
- 【Flutter 專題】71 圖解基本隱式動畫 Widget|8月更文挑戰Flutter圖解動畫
- kendoUI 多選下拉選單 kendoMultiSelectUI
- Flutter 32: 圖解 TextPainter 與 TextSpFlutter圖解AI
- javascript模擬美化select下拉選單效果詳解JavaScript
- 圖解 ReactiveCocoa 基本函式圖解React函式
- 【Flutter 專題】65 圖解基本 TextField 文字輸入框 (二)|8月更文挑戰Flutter圖解
- CSS 二級下拉選單CSS
- HTML select下拉選單HTML
- HTML select 下拉選單HTML
- CSS二級下拉選單CSS
- jQuery 二級下拉選單jQuery