addHourMinutesSelector method
双数字选择,时间和分的选择,返回的数据是由分隔符':'分割的。
Implementation
void addHourMinutesSelector({String? key, Widget? title}) {
var _currentValue;
// 下拉数字列表
List<int> _createNumList({int from = 0, int end = 100}) {
List<int> _list = <int>[];
for (int i = from; i <= end; i++) {
_list.add(i);
}
return _list;
}
final List<int> _hourValues = _createNumList(from: 0, end: 24);
final List<int> _minuteValues = _createNumList(end: 60);
// menu item
DropdownMenuItem<int> _createDropdownMenuItem(int value) {
return DropdownMenuItem<int>(
value: value,
alignment: Alignment.centerRight,
child: Padding(
padding: kHorizontalPaddingTen,
child: Text("$value", style: TextStyle(color: _textColor))),
);
}
final Widget _hint = Padding(
padding: kHorizontalPaddingTen,
child: const Text(
"请选择",
style: TextStyle(fontSize: 13.0),
),
);
final InputDecoration _decoration = InputDecoration(
border: _outlineInputBorder,
// suffixText: "dd",
// alignLabelWithHint: true,
);
Widget _createDropdownButtonFormField(List<int> values, bool isHour) {
// Duration _duration = Duration(hours: 0, minutes: 0);
return StatefulBuilder(builder: (context, StateSetter setState) {
return DropdownButtonFormField<int>(
value: _currentValue,
hint: _hint,
isExpanded: true,
items: values.map((e) => _createDropdownMenuItem(e)).toList(),
decoration: _decoration.copyWith(labelText: isHour ? "小时" : "分钟"),
borderRadius: BorderRadius.circular(10.0),
dropdownColor: _backgroundColor,
onChanged: (value) {
setState(() {
_currentValue = value!;
});
},
onSaved: (value) {
print("onSave $isHour, $value");
String? tmp = (maps[key ?? "field${maps.length}"] ?? "") as String;
if (tmp.isNotEmpty) {
tmp = "$tmp:";
}
maps[key ?? "field${maps.length}"] = "$tmp$value";
},
validator: (value) {
if (value == null) {
return "Select it value.";
}
return null;
},
);
});
}
// 时
final Widget _hours = _createDropdownButtonFormField(_hourValues, true);
// 分
final Widget _minutes =
_createDropdownButtonFormField(_minuteValues, false);
final Widget _widget = Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Padding(
// padding: EdgeInsets.symmetric(vertical: 10.0),
// child: title ??
// Text(
// "计划耗费",
// style: TextStyle(color: _textColor, fontSize: 16.0, fontWeight: FontWeight.w400),
// ),
// ),
Row(
children: [
Expanded(
child: Padding(
padding: EdgeInsets.only(top: 5.0, bottom: 5.0, right: 2.5),
child: _hours)),
Expanded(
child: Padding(
padding: EdgeInsets.only(top: 5.0, bottom: 5.0, left: 2.5),
child: _minutes)),
],
),
],
);
_children.add(_widget);
}