import 'package:chat/data/constants.dart'; import 'package:chat/generated/i18n.dart'; import 'package:chat/utils/CustomUI.dart'; import 'package:flutter/material.dart'; import 'package:oktoast/oktoast.dart'; //自定义 地址选择 class SelectPage extends StatefulWidget { @required final String title; @required final dataId; final str; final callback; final provinces; final cities; final isSingle; final int mostNum; SelectPage( {Key key, this.str, this.title, this.dataId, this.callback, this.provinces, this.cities, this.isSingle, this.mostNum}) : super(key: key); _SelectPageState createState() => _SelectPageState(); } class _SelectPageState extends State { String leftSelection; Set tempRankId = new Set(); @override void initState() { super.initState(); leftSelection = widget.provinces.keys.first; tempRankId = widget.dataId.toSet(); } @override void dispose() { tempRankId.clear(); super.dispose(); } List _buildLeftSelection() { List result = []; widget.provinces.forEach((k, v) => result.add(_buildItem(k, v, true))); return result; } List _buildRightSelection() { List result = []; widget.cities[leftSelection].forEach( (k, v) => result.add(_buildItem('$leftSelection-$k', v, false))); return result; } Widget _buildItem(key, value, isLeft) { return InkWell( onTap: () { if (isLeft) { setState(() { leftSelection = key; }); } else { setState(() { // //常驻城市不能跨国家选中 if (!widget.isSingle && tempRankId.length > 0 && tempRankId.first.split('-')[0] != leftSelection) { showToast('常驻城市不能跨国家'); return; } if (tempRankId.contains(key)) { if (!widget.isSingle) tempRankId.remove(key); } else { if (tempRankId.length >= widget.mostNum) { showToast(I18n.of(context) .most .replaceFirst('/s1', widget.mostNum.toString())); return; } tempRankId.add(key); } }); //单选直接关闭 if (widget.isSingle) { if (widget.dataId.length != 0 && tempRankId.length >= 2) { tempRankId.remove(widget.dataId.first); } widget.callback(tempRankId); } } }, highlightColor: Colors.transparent, radius: 0.0, child: new Container( height: 50, child: new Align( alignment: Alignment.center, child: new Text( value, textScaleFactor: 1.0, textAlign: TextAlign.center, style: isLeft ? TextStyle( color: leftSelection == key ? Colors.white : Constants.BlackTextColor) : TextStyle( color: tempRankId.contains(key) ? Constants.BlueTextColor : Constants.BlackTextColor), ), ), decoration: BoxDecoration( color: leftSelection == key ? Constants.BlueTextColor : Colors.white, border: Border(top: BorderSide(color: Colors.grey, width: 0.5)), ), )); } @override Widget build(BuildContext context) { Widget appBar = new AppBar( title: new Text(widget.title, textScaleFactor: 1.0), elevation: 0, leading: CustomUI.buildCustomLeading(context), actions: [ new Container( alignment: Alignment.center, child: new InkWell( child: new Padding( padding: EdgeInsets.only(right: 15, left: 15, top: 10, bottom: 10), child: new Text(I18n.of(context).determine, textScaleFactor: 1.0, style: Constants.AppBarActionTextStyle), ), onTap: () { widget.callback(tempRankId); }, ), ) ], centerTitle: true, ); return Scaffold( body: SafeArea( child: Center( child: Container( height: MediaQuery.of(context).size.height, width: MediaQuery.of(context).size.width, child: Row( children: [ Container( width: MediaQuery.of(context).size.width * 0.5, child: ListView( children: _buildLeftSelection(), ), decoration: BoxDecoration( border: Border(right: BorderSide(color: Colors.grey, width: 1)), )), Container( width: MediaQuery.of(context).size.width * 0.5, child: ListView( children: _buildRightSelection(), ), ), ], ), ), )), appBar: appBar, ); } }