Flutter技术求助:如何从下拉列表获取选中企业的BaseUrl用于认证
解决Flutter下拉列表获取选中企业base_url的问题
嘿,作为Flutter新手遇到这个问题太正常啦,我来帮你搞定!你的当前代码里,下拉菜单的value只存储了企业的id字符串,所以在onChanged回调里没法直接拿到对应的baseUrl。这里有两种简单的修改方案,你可以根据需求选一种:
方案一:直接绑定整个企业对象(推荐)
这种方法最直观,把下拉菜单的选项值设置为整个企业Map,选中时就能直接获取baseUrl:
class DropDown extends StatefulWidget { DropDown({Key key}) : super(key: key); @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<DropDown> { Map _mySelection; // 把类型从String改成Map String _myBaseUrl; List<Map> _myJson = [ {"id":2,"society":"test","baseUrl":"url.com"}, {"id":1,"society":"planeef","baseUrl":"url.com"} ]; @override Widget build(BuildContext context) { return Container( child: DropdownButton<Map>( // 泛型指定为Map isDense: true, hint: const Text("Select"), value: _mySelection, onChanged: (Map newValue) { setState(() { _mySelection = newValue; _myBaseUrl = newValue["baseUrl"]; // 直接提取baseUrl // 这里就可以用_myBaseUrl执行你的认证逻辑了 print("当前选中的baseUrl: $_myBaseUrl"); }); }, items: _myJson.map((Map map) { return DropdownMenuItem<Map>( // 泛型指定为Map value: map, // 将整个企业对象作为选项值 child: Text(map["society"]), ); }).toList(), ), ); } }
优势:不仅能拿到baseUrl,后续如果需要使用企业的id、society等其他字段,直接从_mySelection里取就行,不用额外遍历查找。
方案二:通过选中的id查找对应baseUrl
如果你想保留用id作为选项值的逻辑,可以在onChanged里根据id去数组中匹配对应的企业对象:
class DropDown extends StatefulWidget { DropDown({Key key}) : super(key: key); @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<DropDown> { String _mySelection; String _myBaseUrl; List<Map> _myJson = [ {"id":2,"society":"test","baseUrl":"url.com"}, {"id":1,"society":"planeef","baseUrl":"url.com"} ]; @override Widget build(BuildContext context) { return Container( child: DropdownButton<String>( isDense: true, hint: const Text("Select"), value: _mySelection, onChanged: (String newValue) { setState(() { _mySelection = newValue; // 根据选中的id查找对应的企业对象 final selectedEnterprise = _myJson.firstWhere( (item) => item["id"].toString() == newValue, orElse: () => {}, // 处理找不到匹配项的情况,避免报错 ); _myBaseUrl = selectedEnterprise["baseUrl"]; print("当前选中的baseUrl: $_myBaseUrl"); }); }, items: _myJson.map((Map map) { return DropdownMenuItem<String>( value: map["id"].toString(), child: Text(map["society"]), ); }).toList(), ), ); } }
注意:firstWhere的orElse参数很重要,防止出现没有匹配项时抛出异常的情况。
两种方案都能让你成功获取到选中企业的baseUrl,之后就可以把_myBaseUrl用在你的认证操作里啦!
内容的提问来源于stack exchange,提问作者LaCanaille
相关产品推荐
相关产品推荐

