addHourMinutesSelector method

void addHourMinutesSelector({
  1. String? key,
  2. Widget? title,
})

双数字选择,时间和分的选择,返回的数据是由分隔符':'分割的。

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);
}