#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. Рад помочь! Спасибо, что указали на мою опечатку.