Flutter showDialog



可以在不传递上下文的情况下在函数内显示dialog吗?

void test(){
showDialog(context: context, builder: (_) => AlertDialog(
content: Column(
children: [
Row(
children: const [
Icon(Icons.check_circle, color: Colors.green,),
Text("Hi"),
],
)
],
),
));    
}

对不起,我没有很好地解释,没有将上下文传递给函数,而不是showDialog

根据文档(https://api.flutter.dev/flutter/material/showDialog.html)你不能,它是必需的。

简短的回答是不,你不能.

长答案:首先,BuildContext是一个对象类型,因此为了消除context属性和context值之间的冲突,我们将其重命名为contextGotFromUI

注意:contextGotFromUI在这里只是一个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中的context属性需要从它的实现中设置:

Future<T?> showDialog<T>({
required BuildContext context,
required WidgetBuilder builder,
bool barrierDismissible = true,
// more code

BuildContext是了解flutter的一个重要主题,要在用户实际导航的屏幕顶部显示对话框小部件,并在任何时候看到,BuildContext是什么告诉它显示在具有特定上下文的小部件顶部,而不是其他屏幕。

来自showDialog官方文档:

context参数用于查找对话框的Navigator和Theme。它仅在调用方法时使用。它对应的小部件可以在对话框关闭之前安全地从树中删除。

因此,为了显示来自外部方法的对话框,您需要传递属于特定小部件的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
}
}

可以,但是必须在有状态小部件中而不是在普通类中创建函数。如果您在普通类中创建函数,则需要上下文!

void test(BuildContext context){
showDialog(context: context, builder: (_) => AlertDialog(
content: Column(
children: [
Row(
children: const [
Icon(Icons.check_circle, color: Colors.green,),
Text("Hi"),
],
)
],
),
));    
}

相关内容

  • 没有找到相关文章

最新更新