多次使用showTimePicker给多个变量赋值时间

Using showTimePicker multiple times to assign times to multiple variables

我正在使用 showTimePicker 从用户那里获取时间。我可以随心所欲地获取时间并将其分配给一个变量time。问题是,在我的代码中会有很多实例,我想获取时间但将其设为一个全新的变量,time2time3 或其他变量。在我的代码中,每当我调用函数 selectTime() 时,它只会为一个变量 time 设置值。我也不确定它如何影响 timeOfDay picked;。我可以通过为每个变量编写一个新的 selectTime() 函数来解决这些问题,但这看起来很糟糕。

如何更改我的代码,以便可以在不更改其他变量时间的情况下为任何变量分配新时间。我对 flutter 还很陌生,非常感谢任何帮助。

下面是我的代码。当然我会有另一个凸起的按钮用于更改 time2.

干杯

import 'dart:async';

void main(){
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Troponin Algorithm',
      home: CustomForm(),
    );
  }
}

class CustomForm extends StatefulWidget {
  @override
  _CustomFormState createState() => _CustomFormState();
}

class _CustomFormState extends State<CustomForm> {
  
  timeFormatter(number) {
    //String str;
    if (number > 9) {
      return number.toString();
    }
    else {
      //str = '0'+number.toString();
      return '0'+number.toString();
    }
  }

  TimeOfDay time = TimeOfDay.now();
  TimeOfDay time2 = TimeOfDay.now();
  TimeOfDay picked;
  String hour;
  String mins;
  String hour2;
  String mins2;

  Future<Null> selectTime(BuildContext context) async {
    picked = await showTimePicker(
      context: context,
      initialTime: time,
    );
    if (picked != null) {
      setState(() {
        time = picked;
      });
    }
  }

  @override

  Widget build(BuildContext context) {
    mins = timeFormatter(time.minute);
    hour = timeFormatter(time.hour);
    //mins2 = timeFormatter(time2.minute);
    
    return Scaffold(
        appBar: AppBar(
            title: Text('Troponin Algorthm')
        ),
        body: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Row(
              children: <Widget>[
                Expanded(
                  child: Text('time is $hour:$mins'),     //'${_time.hour}:${_time.minute}'
                ),
                RaisedButton(
                    child: Text('change time'),
                    onPressed: () {
                      setState(() {
                        selectTime(context);
                      });
                    }
                ),
              ],
            ),
            Text('time1 is: $time'),
          ],
        )
    );
  }```

而不是 selectTime returning a Future<Null>,您可以将其修改为 return a Future<TimeOfDay>docs 指定 showTimePicker 将 return 根据用户的选择 Future<TimeOfDay>null 如果用户取消对话。

Future<TimeOfDay> selectTime(BuildContext context) async {
    picked = await showTimePicker(
      context: context,
      initialTime: time,
    );
    return picked;
}

并像这样更改您的 RaisedButton

RaisedButton(
    child: Text('change time'),
    onPressed: () async {
        // We wait for either a Future<TimeOfDay> or a null
        var temp = await selectTime(context) ;
        if (temp != null) {
            setState(() {
                time = temp;
            });
        }
    },
),