为什么我必须在构建器中创建BuildContext实例才能打印alertDialog?

时间:2019-06-20 12:34:32

标签: flutter flutter-layout flutter-dependencies

我想使用Flutter创建基本项目,所以这些天来,我在理解Flutter的工作原理和流程方面遇到了很多问题... 代码中有问题,请给出答案,并支持我来了解有关flutter的更多信息.... flutter很酷,我很喜欢。

提前谢谢

void  _showAlertDialog() {
   var alertDialog = AlertDialog(
  title: Text("Hey,This is loser"),
 );
 showDialog(context: context,
 builder: (BuildContext context1){
   return alertDialog;
 });

}

1 个答案:

答案 0 :(得分:0)

您可能会发现showDialog函数here的实现。 让我们从您没有在代码中创建BuildContext实例的事实开始,您永远不会调用BuildContext()构造函数。 实际上,您不需要创建一个。

如果您的问题是为什么builder类型的WidgetBuilder参数需要从概念上输入BuildContext的实例,那么答案是此构建器可能会构建一些东西比仅带有“ hello”消息的警报要复杂得多,并且要构建复杂的对话框,您可能需要用于导航,查询,主题化等的构建上下文。

还要注意,您不需要传递此BuildContext参数,只需将构建器“声明”或“描述”为一个函数,框架本身将创建并提供`BuildContex'的实际实例。 '。

一个简单的示例,其中使用builder参数在警报的context中使用主题化和导航:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Test alert theming"),
      ),
      body: Center(
        child: OutlineButton(
          child: Text("Push Me"),
          onPressed: () => showDialog(
                context: context,
                builder: (BuildContext context) {
                  return Dialog(
                      child: Column(
                    children: <Widget>[
                      Text(
                        "Themed alert content",
                        style: Theme.of(context).textTheme.title,
                      ),
                      OutlineButton(
                        child: Text("Close"),
                        onPressed: () => Navigator.of(context).pop(),
                      ),
                    ],
                  ));
                },
                barrierDismissible: true,
              ),
        ),
      ),
    );
  }
}

如您所见,我使用了title文本主题,您可以将其更改为其他内容,例如subtitlebody2。要提取主题,您需要在Theme.of(context)中有一个上下文。

为进行导航,还需要Navigator.of(context)中的上下文。