在Flutter中创建对话框

你可以在几乎所有的移动应用程序上看到对话框。大多数应用程序使用对话框来发出警告或促进中间操作,这是应用程序主要流程的一个替代方案。

举个例子,假设有一个提交按钮,当用户按下提交按钮时,会显示一个对话框,以表明该操作已经完成,并包括下一步的指示。这是一个来自主流程的中间动作。

因为对话框对移动应用程序来说是必不可少的,Flutter为警报和全屏对话框提供了便利,也让你可以选择创建自定义对话框。我们将介绍Flutter中对话框的这些方面。

  • 在Flutter中创建一个警报对话框
  • 将动作按钮应用于对话框
  • 关闭和解除对话框
  • 创建一个自定义对话框
  • 创建一个全屏对话框

在Flutter中创建一个警报对话框

首先,让我们创建一个简单的对话框。AlertDialog 小组件提供了在Flutter中创建一个基本对话框所需的所有功能。titlecontent 属性应被指定以显示一个适当的对话框。这两个属性都不是必须的,但如果你不正确地指定这些属性,你将看不到任何内容或标题。

AlertDialog(
  title: Text("Success"),
    content: Text("Save successfully"),
)

复制代码

如果你想显示一个iOS风格的对话框,你可以使用CupertinoAlertDialog widget而不是AlertDialog widget。

CupertinoAlertDialog(
  title: Text("Success"),
    content: Text("Saved successfully"),
)

复制代码

现在的问题是,我们怎样才能显示这个对话框?这就是为什么我们需要使用showDialog 方法,这有助于在应用程序的当前上下文上方显示对话框。这将照顾到在显示对话框时添加深色的透明层。

你可以创建一个按钮(ElevatedButton/TextButton),像下面这样在showDialog 方法中添加onPressed 方法,在你按下按钮时显示。

ElevatedButton(
  child: Text("Show Me the Dialog"),
  onPressed:(){
    showDialog(context: context, builder: (BuildContext context){
    return AlertDialog(
      title: Text("Success"),
      content: Text("Saved successfully"),
    );
    });
  }
)

复制代码

Flutter AlertDialog

Flutter AlertDialog Cupertino

你可以根据你的需要,通过设置backgroundColortitleTextStyle 属性来进一步定制对话框。但是这些属性在CupertinoAlertDialog widget中是不可用的,只能在AlertDialog widget中使用。

默认的AlertDialog 的边框半径为4。shape 属性让你可以根据需要灵活地定制这个值。但是CupertinoAlertDialog ,不允许用户自定义这些属性,你必须坚持使用默认值。

AlertDialog(
  title: Text("Success"),
  titleTextStyle: TextStyle(fontWeight: FontWeight.bold,color: Colors.black,fontSize: 20),
  backgroundColor: Colors.greenAccent,
  shape: RoundedRectangleBorder(
    borderRadius: BorderRadius.all(Radius.circular(20))
  ),
  content: Text("Save successfully"),
)

复制代码

Flutter AlertDialog Background Color

将动作按钮应用到对话框中

AlertDialog 小组件可以指定需要在对话框中显示的行动按钮。这些按钮将显示在对话框的底部。

你可以拥有的行动按钮的数量没有限制。但最好使用1-3个动作按钮,以获得良好的用户体验和不那么杂乱的用户界面。

      
AlertDialog(
  title: Text("Success"),
  titleTextStyle: 
    TextStyle(
      fontWeight: FontWeight.bold,
      color: Colors.black,fontSize: 20),
    actionsOverflowButtonSpacing: 20,
    actions: [
      ElevatedButton(onPressed: (){
      }, child: Text("Back")),
      ElevatedButton(onPressed: (){
      }, child: Text("Next")),
    ],
    content: Text("Saved successfully"),
)

复制代码

Flutter AlertDialog Action Buttons

CupertinoAlertDialog ,而不是普通的按钮,CupertinoDialogAction 小部件必须在actions 小部件阵列里面使用。

CupertinoAlertDialog(
  title: Text("Success"),
  actions: [
    CupertinoDialogAction(onPressed: (){
    }, child: Text("Back")),
    CupertinoDialogAction(onPressed: (){
    }, child: Text("Next")),
  ],
  content: Text("Saved successfully"),
)

复制代码

Flutter CupertinoAlertDialog Action Widget

如果你的应用程序需要更多的动作按钮,你可以根据你的需要添加更多。如果没有空间显示在一个内联中,这些将堆积成一列。如果发生这种溢出,你可以通过设置actionsOverflowButtonSpacing 属性来控制按钮的间距。

actionsOverflowButtonSpacing 属性只在AlertDialog widget中可用,在CupertinoAlertDialog 中不可用。在CupertinoAlertDialog ,它通常每行最多显示两个按钮,如果有更多的动作按钮,这些按钮将被垂直显示。

AlertDialog(
  title: Text("Success"),
  titleTextStyle: 
    TextStyle(fontWeight: FontWeight.bold,color: Colors.black,fontSize: 20),
  actionsOverflowButtonSpacing: 20,
  actions: [
    ElevatedButton(onPressed: (){

    }, child: Text("Back")),
    ElevatedButton(onPressed: (){

    }, child: Text("Next")),
    ElevatedButton(onPressed: (){

    }, child: Text("Next")),
    ElevatedButton(onPressed: (){

    }, child: Text("Next")),
    ElevatedButton(onPressed: (){

    }, child: Text("Next")),
    ElevatedButton(onPressed: (){

    }, child: Text("Next")),
  ],
  content: Text("Saved successfully"),
)

复制代码

Flutter AlertDialog with Multiple Action Buttons

CupertinoAlertDialog(
  title: Text("Success"),

  actions: [
    CupertinoDialogAction(onPressed: (){

    }, child: Text("Back")),
    CupertinoDialogAction(onPressed: (){

    }, child: Text("Next")),
    CupertinoDialogAction(onPressed: (){

    }, child: Text("Next")),
    CupertinoDialogAction(onPressed: (){

    }, child: Text("Next")),
    CupertinoDialogAction(onPressed: (){

    }, child: Text("Next")),
    CupertinoDialogAction(onPressed: (){

    }, child: Text("Next")),
  ],
  content: Text("Saved successfully"),
)

复制代码

Flutter CupertinoAlertDialog with Multiple Action Buttons

关闭和解散对话框

你可以使用Navigator 类来在你按下按钮时移除对话框。

AlertDialog(
  title: Text("Success"),
  titleTextStyle: TextStyle(
    fontWeight: FontWeight.bold,color: Colors.black,fontSize: 20),
  actions: [
    ElevatedButton(onPressed: (){
    Navigator.of(context).pop();
    }, child: Text("Close")),
  ],
  content: Text("Saved successfully"),
)

复制代码

Dismissing Dialog in Flutter

创建一个自定义的对话框

AlertDialog 小组件可能不适合您在应用程序中处理的每个自定义场景。这时,Dialog 小组件就派上用场了。

即使AlertDialog 的内容属性接受widget 类型,但建议只添加一个简单的对话信息,这意味着它不适合自定义对话框。

另一方面,Dialog widget可以根据你的需要创建一个自定义版本的对话框。我添加了一个Container 来控制对话框的高度,在Container 里面,有一个Column 小部件来垂直布置多个小部件。你可以根据你的需要来定制这些小部件。

Dialog(
  child: Container(
    height: 300,
    child: Column(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        FlutterLogo(size: 150,),
        Text("This is a Custom Dialog",style:TextStyle(fontSize: 20),),
        ElevatedButton(

        onPressed: (){
        Navigator.of(context).pop();
          }, child: Text("Close"))
      ],
    ),
  ),
)

复制代码

Flutter Custom Dialog

如果你想改变对话框的形状,你可以像下面的例子一样为ShapeBorder ,设置shape 属性。这里我使用了一个RoundedRectangleBorder widget来改变对话框的边界半径。

Dialog(
  shape: RoundedRectangleBorder(
    borderRadius:BorderRadius.circular(30.0)),
  child: Container(
    height: 300,
    child: Column(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        FlutterLogo(size: 150,),
        Text("This is a Custom Dialog",style:TextStyle(fontSize: 20),),
        ElevatedButton(

        onPressed: (){
        Navigator.of(context).pop();
          }, child: Text("Close"))
      ],
    ),
  ),
) 

复制代码

Flutter Rounded Corner Custom Dialog

对话框的默认标高为24。标高是对话框的_Z_坐标,可以通过设置对话框的elevation 属性来改变。如果你把标高设置为0,你可以看到没有阴影,它显示的对话框和下面的视图都是在同一个表面上。

Flutter Dialog with No Shadow

对于AlertDialog ,对话框的背景颜色可以通过改变Dialog 小组件的backgroundColor 属性来设置。

Dialog(
  elevation: 0,
  backgroundColor: Colors.limeAccent,
  shape: RoundedRectangleBorder(
    borderRadius: BorderRadius.circular(30.0)),
  child: Container(
    height: 300,
    child: Column(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        FlutterLogo( size: 150,),
        Text(
          "This is a Custom Dialog",
          style: TextStyle(fontSize: 20),
        ),
        ElevatedButton(
          onPressed: () {
            Navigator.of(context).pop();
          },
          child: Text("Close"))
       ],
    ),
  ),
)

复制代码

Flutter Dialog with a Green Background

创建一个全屏对话框

创建全屏对话框不能通过showDialog 方法完成。相反,请使用showGeneralDialog 方法。

pageBuilder ,你应该指定你的对话框部件实现。作为第一个部件,你可以指定SizedBox.expand 部件,它可以将你的普通对话框转换为全屏对话框。

除了pageBuilder 属性外,你还可以通过transitionDuration 属性来控制对话框的动画持续时间,以给出漂亮而流畅的动画。

showGeneralDialog(
  context: context,
  transitionDuration: Duration(milliseconds: 400),
  pageBuilder: (bc, ania, anis) {
    return SizedBox.expand(
      child: Container(
        color: Colors.black,
        child: Padding(
          padding: const EdgeInsets.all(20.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              FlutterLogo(
               size: 200,
              ),
              Text(
                "This is a Full Screen Dialog",
                style: TextStyle(
                fontSize: 20,
                decoration: TextDecoration.none),
              ),
              ElevatedButton(
                onPressed: () {
                  Navigator.of(context).pop();
                },
              child: Text("Close"))
            ],
          ),
        ),
      ),
    );
})

复制代码

Full-Screen Dialog in Flutter

结论

应用警报对话框、自定义对话框或全屏对话框将完全取决于你的应用程序和该应用程序的不同使用情况。

警报对话框更适用于向用户发出快速和简单的警报,如成功信息或信息警报。自定义对话框可以用在需要更多个性化对话框的地方,有多个小工具。如果你想给用户一个全新的屏幕的感觉,而不需要实际导航到一个全新的屏幕,就可以使用全屏对话框。

在这些对话框中,自定义对话框将是最有用的,因为你可以为每个对话框赋予你自己的个人风格,同时保持你的应用程序的主题。

原文链接:
blog.logrocket.com/creating-di…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享