所以我试图从抖动中使用showTimePicker函数,但是会发生该对话框显示带有时间选择器的情况,但是一旦我在对话框中点击任何内容,它就会关闭并返回null。即使我在选择器中点击一个数字。
我仅在iOS上对此进行了测试。
我尝试将InkWell封装在一个Builder中,并为showTimePicker函数提供该Builder的上下文,但是我得到的结果相同。
我以为InkWell可能正在捕获对话框中的tap事件,但是我已经在_pickNewDailyResetTime方法中设置了一个断点,并且该断点仅在正确的时间出现,而不是在我点击对话框时出现。
如果重要的话,我在父窗口小部件的底部菜单中设置了一个导航器。
无论如何,这是我的小部件代码,感谢您的帮助:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class DailyResetTime extends StatefulWidget {
DailyResetTime();
@override
_DailyResetTimeState createState() => _DailyResetTimeState();
}
class _DailyResetTimeState extends State<DailyResetTime> {
TimeOfDay _dailyResetTime;
@override
void initState() {
super.initState();
_loadDailyResetTime();
}
_loadDailyResetTime() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
String sDailyResetTime = prefs.getString('dailyResetTime');
_dailyResetTime = sDailyResetTime != null
? TimeOfDay(
hour: int.parse(sDailyResetTime.split(":")[0]),
minute: int.parse(sDailyResetTime.split(":")[1]))
: TimeOfDay(hour: 0, minute: 0);
});
}
_pickNewDailyResetTime() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
showTimePicker(context: context, initialTime: _dailyResetTime)
.then((value) {
if (value == null) {
return;
}
setState(() {
_dailyResetTime = value;
prefs.setString('dailyResetTime',
value.hour.toString() + ":" + value.minute.toString());
});
});
}
@override
Widget build(BuildContext context) {
return InkWell(
onTap: _pickNewDailyResetTime,
child: Container(
height: 48.0,
padding: EdgeInsets.only(right: 24),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Colors.black12, width: 1.0))),
child: Row(
children: [
Text('Daily reset time'),
Spacer(),
Text(_dailyResetTime?.format(context) ?? '')
],
)));
}
}
答案 0 :(得分:0)
显然导航器是问题所在,将useRootNavigator:false传递给函数参数为我解决了该问题。