如何向buildContext范围外的其他Widget传递context?
解决方法
方法1:修改map回调,显式传递context
把users.map(buildUser).toList()改成带参数的回调,将当前context传给buildUser:
return ListView( children: users.map((user) => buildUser(context, user)).toList(), );
同时调整buildUser函数的定义,让它接收BuildContext和User两个参数:
Widget buildUser(BuildContext context, User user) { // 这里可使用context调用需要的外部Widget,示例: return ListTile( title: Text(user.name), onTap: () { Navigator.push(context, MaterialPageRoute(builder: (context) => UserDetailPage(user: user))); }, ); }
方法2:改用ListView.builder(更推荐,性能更优)
如果用户数据量较大,ListView.builder比直接map生成列表更高效,且它的itemBuilder本身会提供context,直接使用即可:
return ListView.builder( itemCount: users.length, itemBuilder: (context, index) { final user = users[index]; return buildUser(context, user); // 也可直接在此编写Widget代码,无需单独的buildUser函数 // return ListTile(title: Text(user.name)); }, );
核心逻辑:你的buildUser(或要调用的外部Widget)依赖BuildContext,因此必须将当前StreamBuilder范围内的context传递给它——要么通过map回调传参,要么利用ListView.builder的itemBuilder自带的context。
内容的提问来源于stack exchange,提问作者Upos Tyni
相关产品推荐
相关产品推荐

