可以在不传递上下文的情况下在函数内显示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"),
],
)
],
),
));
}