我制作了一个由另外 2 个小部件 A 和 B 组成的小部件 (MyComplexWidget)。
在构建 MyComplexWidget 时,我向其传递了其子控件之一的 (A, B)
onTap/onPressed
属性的回调函数。
问题是这个回调需要其当前父级(例如小部件 A 或 B)的
BuildContext
,因为,比方说,它在内部进行导航:
Navigator.pushNamed(context, "newroute");
理想情况下,我想要这个:
MyComplexWidget(
// this cb is eventually passed on
// Widget A's and B's constructors.
onTap: () {
Navigator.pushNamed(context, "newroute");
}
);
其中
context
是分配了此 onTap
回调(在 MyComplexWidget
内部)的子控件(控件 A 或 B)的 BuildContext,而不是创建闭包回调的当前 BuildContext(如果有的话!) .
顺便说一句,
Navigator.pushNamed()
只是一个例子,回调中可能还有其他需要上下文的东西。我并不是在寻求有关如何在没有上下文的情况下导航等的解决方案。
这怎么可能?
您可以使用全局键来查找特定小部件的上下文。 然而,这只适用于回调,上下文不能直接在构建中使用,例如
padding: MediaQuery.paddingOf(navKey.currentContext!);
class NavWidget extends StatelessWidget {
const NavWidget({super.key, required this.navKey});
final GlobalKey navKey;
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () {
if (navKey.currentContext == null) return;
Navigator.pushNamed(navKey.currentContext!, '/next');
},
child: const Text('Next'),
);
}
}