flutter - 如何从另一个有状态小部件调用的有状态小部件正确返回数据?
问题描述
我正在从有状态小部件调用日期时间选择器小部件。我需要能够在调用它的小部件中使用从日期时间小部件中选择的值。解决这个问题的正确方法是什么?
这就是调用它的小部件的外观。当然瘦了。
SingleChildScrollView(
child:Container(
//WRAPS ENTIRE SHEET
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blue, Colors.red],
begin: Alignment.bottomCenter,
end: Alignment.topCenter,
stops: [0.1, 1])),
height: MediaQuery.of(context).size.height * .40,
child: ListView( children: [
SizedBox(
height: 10,
),
Container(
child: DatePicker(optionalText: "")
),
],),
),
)
],);
}
这是我需要返回数据的小部件
class _DatePickerState extends State<DatePicker> {
DateTime selectedDate = DateTime.now();
@override
Widget build(BuildContext context) {
return Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Container(
width: MediaQuery.of(context).size.width * .50,
height: MediaQuery.of(context).size.height * .07,
child: Padding(
padding: EdgeInsets.fromLTRB(33, 0, 5, 0),
child: RaisedButton(
color: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10)),
child: dateHyphenReplacer(selectedDate),
onPressed: () => _selectDate(context),
),
),
),
Padding(
padding: EdgeInsets.fromLTRB(5, 10, 0, 10),
child: Icon(
Icons.calendar_today,
color: Colors.white,
size: 30,
),
),
Container(
child: Padding(
padding: EdgeInsets.all(8.0),
child: AutoSizeText(
'Choose ${widget.optionalText} Date',
style: TextStyle(
color: Colors.white,
fontStyle: FontStyle.italic,
fontFamily: 'Montserrat'),
),
),
),
],
),
);
}
Future<void> _selectDate(BuildContext context) async {
final DateTime picked = await showDatePicker(
context: context,
initialDate: selectedDate,
firstDate: DateTime(2015, 8),
lastDate: DateTime(2101));
if (picked != null && picked != selectedDate)
setState(() {
selectedDate = picked;
});
return selectedDate;
}
dateHyphenReplacer(date){
date = formatDate(date, [mm, '/',dd,'/',yy]);
return Text('$date', style: TextStyle(color: Colors.blue, fontSize: 20));
}
}
解决方案
将变量存储DateTime
在父窗口小部件中并将其传递给DatePicker
构造函数。选择A时DateTime
,设置widget.selectedDateTime
。但是,这种方法不会自动重建父窗口小部件,因此不会更新对DateTime
.