Flutter调用showDatePicker报context不存在及Null不是BuildContext子类型错误如何解决
Flutter context相关报错原因及解决方案
错误含义
- 编译报错
68:14: Error: Getter not found: 'context':你定义的_getDateFromUser方法不属于_AddTaskPageState类的成员,无权访问State类自带的context属性,编译器无法找到对应变量。 - 运行时报错
Unhandled Exception: type 'Null' is not a subtype of type 'BuildContext':按照IDE快速修复新增的局部context变量没有赋值,实际传入showDatePicker的是空值,与方法要求的非空BuildContext类型不匹配。
解决方案
有两种可行处理方式,优先选择第一种:
方式1:将方法移到State类内部作为成员方法(推荐)
State类本身持有当前页面的有效context对象,把方法移入类内部即可直接访问,同时补充选中日期后的状态更新逻辑:
class _AddTaskPageState extends State<AddTaskPage> { DateTime _selectedDate = DateTime.now(); // 方法移到类内部作为成员方法 _getDateFromUser() async { DateTime? _pickerDate = await showDatePicker( context: context, // 直接使用State自带的context,无需额外定义 initialDate: DateTime.now(), firstDate: DateTime(2015), lastDate: DateTime(2121), ); // 选中日期后更新页面展示 if (_pickerDate != null) { setState(() { _selectedDate = _pickerDate; }); } } // 原有build方法保持不变,此处省略原有代码... } // 注意删掉类外原来定义的_getDateFromUser方法,避免冲突
方式2:调用方法时传入context参数
如果不想调整方法位置,可以在调用时把build方法中的context作为参数传入:
// 调用处修改为传入context onPressed: () { _getDateFromUser(context); }, // 方法定义修改为接收context参数 _getDateFromUser(BuildContext context) async { DateTime? _pickerDate = await showDatePicker( context: context, initialDate: DateTime.now(), firstDate: DateTime(2015), lastDate: DateTime(2121), ); }
内容的提问来源于stack exchange,提问作者Muhammad Bayu Kurniawan
相关产品推荐
相关产品推荐

