import 'package:flutter/material.dart'; import '../services/EventBus.dart'; class DropdownItem extends StatefulWidget { DropdownItem( {@required this.listItems, @required this.initValue, @required this.dropdownEvent, this.width = 180, this.height = 35, this.fontSize = 16}); List listItems; String initValue; double width; double height; double fontSize; String dropdownEvent; //处理Dropdown选项改变广播 //如果传递函数,将导致App崩溃 //eventBus.fire(widget.dropdownEvent('Dropdown选项已改变', _selectedValue)); //通过传字符串,用 switch 处理不会导致App崩溃 //widget.dropdownEvent 取值: //case 'SelectLedDwUpdateEvent': //监听 选择LED点位 更新事件 //case 'SelectWzjlUpdateEvent': //监听 选择显示违章记录 更新事件 @override _DropdownItemState createState() => _DropdownItemState(); } class _DropdownItemState extends State { List> _dropDownMenuItems; String _selectedValue; //try_setState(); //避免异常报错 try_setState() { try { setState(() {}); } catch (e) { print('setState(() {})异常:${e}'); } } @override void initState() { _selectedValue = widget.initValue; _dropDownMenuItems = getDropDownMenuItems(); if (widget.dropdownEvent == 'SelectWzjlUpdateEvent') { //eventBus.fire(SelectWzjlUpdateEvent('external_SelectWzjlUpdateEvent', getWzjlString(_mapGetLedXsxxGetData["xsts"]))); ///监听 选择显示违章记录 更新事件 eventBus.on().listen((event) async { print(event.str); //只响应外部发送的'external_SelectWzjlUpdateEvent' //不响应内部发送的'insider_SelectWzjlUpdateEvent' if (event.str == 'external_SelectWzjlUpdateEvent') { //刷新页面数据 //print('external_SelectWzjlUpdateEvent:' '_selectedValue = $_selectedValue'); _selectedValue = event.selectedValue; _dropDownMenuItems = getDropDownMenuItems(); try_setState(); //避免异常报错 } }); } super.initState(); } List> getDropDownMenuItems() { List> items = []; int len = widget.listItems.length; for (int i = 0; i < len; i++) { items.add( DropdownMenuItem( value: widget.listItems[i], child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ (_selectedValue == widget.listItems[i]) ? Container( color: Colors.black12, child: Text(widget.listItems[i], style: TextStyle(fontSize: widget.fontSize)), ) : Text(widget.listItems[i], style: TextStyle(fontSize: widget.fontSize)), SizedBox(width: 2), (_selectedValue == widget.listItems[i]) ? Icon(Icons.check, size: 18) : SizedBox(width: 0), ], ), ), ); } return items; } Widget getDropdownButton() { //_selectedValue = initValue; return DropdownButtonHideUnderline( child: DropdownButton( isExpanded: true, //让下拉图标始终位于末尾 value: _selectedValue, items: _dropDownMenuItems, onChanged: (String _selValue) { _selectedValue = _selValue; print('_selectedValue = $_selectedValue'); _dropDownMenuItems = getDropDownMenuItems(); setState(() {}); ///处理Dropdown选项改变广播 //如果传递函数,将导致App崩溃 //eventBus.fire(widget.dropdownEvent('Dropdown选项已改变', _selectedValue)); //通过传字符串,用 switch 处理不会导致App崩溃 //widget.dropdownEvent 取值: //case 'SelectLedDwUpdateEvent': //监听 选择LED点位 更新事件 //case 'SelectWzjlUpdateEvent': //监听 选择显示违章记录 更新事件 switch (widget.dropdownEvent) { case 'SelectDwfliterUpdateEvent': //监听 选择点位 更新事件 eventBus.fire(SelectDwfliterUpdateEvent('Dropdown选项已改变', _selectedValue)); break; case 'SelectLedDwUpdateEvent': //监听 选择LED点位 更新事件 eventBus.fire(SelectLedDwUpdateEvent('Dropdown选项已改变', _selectedValue)); break; case 'SelectWzjlUpdateEvent': //监听 选择显示违章记录 更新事件 eventBus.fire(SelectWzjlUpdateEvent('insider_SelectWzjlUpdateEvent', _selectedValue)); break; default: break; } }, ), ); } @override Widget build(BuildContext context) { return Container( alignment: Alignment(-1, 0), margin: EdgeInsets.only(bottom: 0), padding: EdgeInsets.only(left: 5), height: widget.height, width: widget.width, decoration: BoxDecoration( //color: Colors.white, border: Border.all(color: Colors.grey, width: 2), borderRadius: BorderRadius.all(Radius.circular(3.0)), ), child: getDropdownButton(), //child: Text('getDropdownButton'), ); } }