Flutter中GestureDetector内调用Navigator.push提示context未定义如何解决
问题原因
你当前的ProductDataGridSource继承自DataGridSource,不属于Flutter Widget体系的类,本身没有内置的context属性,所以直接在回调里调用context就会报未定义的错误。
解决步骤
- 给
ProductDataGridSource增加BuildContext类型的成员变量,修改构造函数要求传入该参数 - 在你初始化
ProductDataGridSource的Widget页面,实例化时把当前页面的context传入 - 在
onPressed回调中使用你存储的这个context变量调用Navigator
修改后的完整代码
class ProductDataGridSource extends DataGridSource { // 新增context成员变量 final BuildContext context; // 构造函数增加context参数要求传入 ProductDataGridSource(this.productList, this.context) { buildDataGridRow(); } late List<DataGridRow> dataGridRows; late List<Product> productList; @override DataGridRowAdapter? buildRow(DataGridRow row) { return DataGridRowAdapter(cells: [ // 提示:TextButton本身自带点击事件,不需要外层套GestureDetector,这里直接去掉了冗余嵌套 TextButton( style: TextButton.styleFrom( primary: Colors.blue, onSurface: Colors.blueAccent, ), onPressed: (){ // 这里调用成员变量存储的context Navigator.push( context, MaterialPageRoute(builder: (context) => const SecondRoute()), ); }, child: Text(row.getCells()[0].value.toString()), ), GestureDetector( onTap: (){ print(row.getCells()[1].value.toString()); }, child: TextButton( style: TextButton.styleFrom( primary: Colors.blue, onSurface: Colors.red, ), onPressed: null, child: Text(row.getCells()[1].value.toString()), ), ), ]); } }
实例化数据源时的传参示例
在你使用该数据源的Widget页面,实例化时传入当前页面的context即可:
@override Widget build(BuildContext context) { // 把当前build方法的context作为第二个参数传入 ProductDataGridSource source = ProductDataGridSource(productList, context); // 后续表格组件绑定数据源的逻辑不变 }
额外提示:如果你第二列也需要做页面跳转,直接复用上面的逻辑即可,不需要额外加参数
内容的提问来源于stack exchange,提问作者salva garcia
相关产品推荐
相关产品推荐

