Flutter:对话框摘要

1.AlertDialog使用:

(1)实现确认对话框:

void showAlertDialog() {
  showDialog<bool>( //用于弹出居中对齐对话框,或用showGeneralDialog自定义对话框
      context: context,
      barrierDismissible: true,  //点击Dialog之外是否关闭对话框,默认为true
      builder: (context) {
        return AlertDialog(  //AlertDialog也是Widget
          title: Text("标题"),
          content: Text("提示文字"),
          actions: <Widget>[  //按钮列表
            TextButton(
              child: Text("取消"),
              onPressed: () => Navigator.of(context).pop(), //关闭对话框
            ),
            TextButton(
              child: Text("确认"),
              onPressed: () {
                //...执行确认的逻辑
                Navigator.of(context).pop(true); //关闭对话框
              },
            ),
          ],
        );
      });
}

(2)实现加载中对话框:

void showLoadingDialog() {
  showDialog(  //用于弹出居中对齐对话框
    context: context,
    barrierDismissible: false,   //点击Dialog之外是否关闭对话框,默认为true
    builder: (context) {
      return UnconstrainedBox(   //去除父级限制
        child: SizedBox(         //用于缩小对话框宽度
          width: 200,            //设置对话框宽度为200
          child: AlertDialog(    //此处使用AlertDialog的content属性实现自定义布局
            content: Column(     //线性布局(垂直方向排列)
              children: <Widget>[
                Padding(
                  padding: EdgeInsets.only(bottom: 20.0),  //加载框与文本间隔20
                  child: CircularProgressIndicator(),
                ),
                Text("加载中...")
              ],
            ),
          ),
        ),
      );
    },
  );
}

2.实现列表对话框:

(1)SimpleDialog实现少量列表对话框:

void showSimpleDialog() {
  showDialog<int>( //用于弹出居中对齐对话框
      context: context,
      barrierDismissible: true,  //点击Dialog之外是否关闭对话框,默认为true
      builder: (context) {
        return SimpleDialog(
          title: Text('选择列表'),
          children: <Widget>[
            SimpleDialogOption(
              child: item布局,
              onPressed: () { //item选择事件
                Navigator.pop(context, 0);   //选择第0行
              }
            ),
            SimpleDialogOption(
              child: item布局,
              onPressed: () { //item选择事件
                Navigator.pop(context, 1);  //选择第1行
              }
            ),
            ...  //省略其他item SimpleDialogOption
          ],
        );
      });
}

(2)Dialog实现大量列表对话框:

void showListDialog() async {
  showDialog<int>( //用于弹出居中对齐对话框
    context: context,
    barrierDismissible: true,  //点击Dialog之外是否关闭对话框,默认为true
    builder: (BuildContext context) {
      return Dialog( //Dialog也是Widget
          child: Column(//垂直方向的线性布局
            children: <Widget>[
              Padding( //标题布局
                padding: EdgeInsets.symmetric(vertical: 20),
                child: Text('选择列表'),
              ),
              Expanded(  //弹性列表布局
                child: ListView.builder(
                itemCount: 总个数,
                itemBuilder: (BuildContext context, int index) {
                  return item组件名(
                    child: item布局,
                    onTap: () => Navigator.of(context).pop(index),  //item点击事件
                  );
                },
              )
            ),
        ],
      ));
    },
  );
}

(3)showModalBottomSheet实现底部列表对话框:

void showBottomListDialog() {
  showModalBottomSheet<int>( //从底部上升,对话框显示在屏幕底部
      context: context,
      builder: (BuildContext context) {
        return ListView.builder(
          itemCount: 列表总数,
          itemBuilder: (BuildContext context, int index) {
            return ...;  //item布局
          },
        );
      }
  );
}

3.实现日历选择对话框:

(1)Android风格日历对话框:

void showAndroidDateDialog() {
  var date = DateTime.now(); //当前日历
  showDatePicker(     //显示日历选择对话框
    context: context,
    initialDate: date,  //初始化日期
    firstDate: date,    //开始日期
    lastDate: date.add( //可选的结束日期
      Duration(days: 365), //未来1年
    ),
  );
}

(2)iOS风格日历对话框:

DateTime? value = null;
void showIOSDateDialog() {
  var date = DateTime.now();
  showCupertinoModalPopup<DateTime>( //(iOS风格,上下滚动)显示日历选择对话框
    context: context,
    builder: (context) {
      return Column(
        mainAxisSize: MainAxisSize.min,               //垂直方向高度为最小
        children: [
          Padding(  //控制标题布局
              padding: EdgeInsets.only(left: 10, top: 10, right: 10),
              child: Row(
                  crossAxisAlignment: CrossAxisAlignment.center, //垂直居中对齐
                  children: [
                    ElevatedButton(child: Text("取消"), onPressed: () {
                      Navigator.of(context).pop();
                    }),
                    Spacer(flex: 1), //空白Widget,横向撑到最大
                    ElevatedButton(child: Text("确认"), onPressed: () {
                      Navigator.of(context).pop(this.value);
                    })
                  ])),
          SizedBox( //控制日历布局高度
            height: 200,
            child: CupertinoDatePicker( //日历Widget
              mode: CupertinoDatePickerMode.dateAndTime,
              minimumDate: date,   //最小可选日期
              maximumDate: date.add(Duration(days: 365)), //最大可选日期
              onDateTimeChanged: (DateTime value) {  //滚动日期时触发此方法
                this.value = value;
              },
            ),
          )
        ],
      );
    },
  );
}


 

猜你喜欢

转载自blog.csdn.net/a526001650a/article/details/127489965
今日推荐