Использование showTimePicker несколько раз для назначения времени нескольким переменным

#flutter #dart #showtimepicker

#flutter #dart #showtimepicker

Вопрос:

Я использую showTimePicker , чтобы получить время от пользователя. Я могу получить столько времени , сколько захочу , и присвоить его переменной time . Проблема в том, что в моем коде будет много случаев, когда я хочу получить время, но сделать его совершенно новой переменной time2 time3 или чем-то еще. В моем коде всякий раз, когда я вызываю функцию 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'),
          ],
        )
    );
  }```
 

Ответ №1:

Вместо selectTime возврата a Future<Null> вы можете изменить его, чтобы вернуть a Future<TimeOfDay> . В документах указано, что showTimePicker это вернет значение a 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;
            });
        }
    },
),
 

Комментарии:

1. Гениально! Я знал, что это как-то связано с тем, что функция не возвращает значение, но не может его выразить. Работает отлично. (Вы поставили «t» там, где вы имели в виду «temp»)

2. Рад помочь! Спасибо, что указали на мою опечатку.