我可以在不传递上下文的情况下在函数中showDialog吗?
void test(){
showDialog(context: context, builder: (_) => AlertDialog(
content: Column(
children: [
Row(
children: const [
Icon(Icons.check_circle, color: Colors.green,),
Text("Hi"),
],
)
],
),
));
}对不起,我没有很好地解释,没有将上下文传递给函数,而不是传递给showDialog
发布于 2022-11-10 16:18:32
根据医生(https://api.flutter.dev/flutter/material/showDialog.html)你不能,它是必需的。
发布于 2022-11-10 17:08:56
简单的回答是不,你不能。
长话短说:首先,BuildContext是一个对象类型,因此为了消除context属性和context值之间的冲突,我们将它重命名为contextGotFromUI。
注意:这里的contextGotFromUI BuildContext 只是一个BuildContext对象sp,我们可以用我们想要的来重命名它。
只是为了不被同一个名字弄糊涂
void test(){
showDialog(context: contextGotFromUI, builder: (_) => AlertDialog(
content: Column(
children: [
Row(
children: const [
Icon(Icons.check_circle, color: Colors.green,),
Text("Hi"),
],
)
],
),
));}从showDialog的实现中设置showDialog属性是必需的:
Future<T?> showDialog<T>({
required BuildContext context,
required WidgetBuilder builder,
bool barrierDismissible = true,
// more codeBuildContext是一个需要迅速理解的重要主题,在用户实际在屏幕上导航并随时看到的屏幕上显示一个对话框小部件,BuildContext是告诉它在具有特定上下文的小部件之上显示的东西,而不是其他屏幕。
上下文参数用于查找对话框的Navigator和主题。它只在调用该方法时使用。在对话框关闭之前,可以安全地从树中删除其相应的小部件。
因此,为了显示来自外部方法的对话框,您需要传递一个属于特定小部件的context,然后在showDialog中使用它。
void test(BuildContext contextGotFromUI){
showDialog(context: contextGotFromUI, builder: (_) => AlertDialog(
content: Column(
children: [
Row(
children: const [
Icon(Icons.check_circle, color: Colors.green,),
Text("Hi"),
],
)
],
),
));}然后从调用该方法的UI中传递它:
Widget build(BuildContext) {
// widgets
//...
onPressed: () {
test(context); // will show an expected dialog on the screen
}
}发布于 2022-11-10 17:09:26
是的,您可以,但是您必须在有状态小部件中创建函数,而不是在普通类中。如果在普通类中创建函数,则需要上下文!
void test(BuildContext context){
showDialog(context: context, builder: (_) => AlertDialog(
content: Column(
children: [
Row(
children: const [
Icon(Icons.check_circle, color: Colors.green,),
Text("Hi"),
],
)
],
),
));
}https://stackoverflow.com/questions/74392143
复制相似问题