使用StaggeredGridView无法传递viewModel实例,报'viewModel未定义'错误
问题解决:Flutter中StaggeredGridView子组件传递ViewModel的错误
错误原因
Items方法里的onTap回调尝试使用viewModel,但这个viewModel是loadMainPage方法的局部参数,Items方法没有直接访问它的权限,所以编译器报错说_MainPageState里没有定义viewModel这个getter。
修复步骤
- 给
Items方法新增ViewModel viewModel参数,让它能接收外部传递的viewModel实例 - 在
loadMainPage方法调用Items时,把参数里的viewModel传进去 - 在
onTap回调里使用传入的viewModel即可
修改后的完整代码
// 新增ViewModel参数 Material Items(IconData icon, String heading, Color cColor, ViewModel viewModel) { return Material( child: InkWell( onTap: () { if (heading == ('Text')) { showMainDialog(context, viewModel); // 现在可以正常访问传入的viewModel } else if (heading == ('Text1')) { showMainDialog(context, viewModel); } }, child: Center( child: Container( child: Column( children: <Widget>[ Expanded( child: Container( child: Icon( icon, color: cColor, ), ), ), Expanded( child: Padding( padding: EdgeInsets.only(top:10), child: Text( heading, softWrap: true, ), ), ) ], ) ), ), )); } Widget loadMainPage(ViewModel viewModel) { return StaggeredGridView.count( shrinkWrap: true, crossAxisCount: 2, crossAxisSpacing: 12.0, mainAxisSpacing: 12.0, children: <Widget>[ Items( Icons.add, ('Text'), Colors.green, viewModel), // 传递viewModel参数 Items( Icons.add, ('Text1'), Colors.red, viewModel), // 传递viewModel参数 ], staggeredTiles: [ StaggeredTile.extent(1, 150.0), StaggeredTile.extent(1, 150.0), ], ); }
内容的提问来源于stack exchange,提问作者BradG
相关产品推荐
相关产品推荐

