美文网首页
Flutter之弹窗封装 2024-11-19 周二

Flutter之弹窗封装 2024-11-19 周二

作者: 勇往直前888 | 来源:发表于2024-11-18 16:28 被阅读0次

简介

  • 弹窗分为从底部向上的Sheet和提示类型的Alert两种。
  • 一般有确认和取消两个按钮。点击按钮之后的操作,可以用回调函数,也可以封装成async/await的形式。
  • 如果不使用GetX,可以考虑使用Completer<T?> completer = Completer();的形式将回调转换成Future;如果使用GetX,那么可以直接使用Get.back(result: T?);的形式回传数据。

1. 文件结构

把工程中的弹窗集中到一个地方,当做一种通用组件


文件位置

2. 公共按钮

把几个通用的按钮用枚举的形式实现复用

/// 弹窗公共按钮, 0-确定, 1-取消,2-操作
enum PopCommonButton {
  ok(value: 0, label: "确认"),
  cancel(value: 1, label: "取消"),
  close(value: 2, label: "关闭");

  const PopCommonButton({required this.value, required this.label});

  final int value;
  final String label;

  static PopCommonButton parse(int value) {
    /// 解析从后台传来的值
    if (value == 1) {
      return PopCommonButton.cancel;
    }
    if (value == 2) {
      return PopCommonButton.close;
    }

    return PopCommonButton.ok;
  }
}

3. Sheet的例子

  • 大概的样子是这样的:


    Sheet例子
  • 业务按钮也通过枚举的形式增加可读性

/// 创建按钮
enum CreateSheetButton {
  activity(value: 0, label:"发起新活动"),
  space(value: 1,label:"创建新空间"),
  theme(value: 2,label:"发表新主题");

  const CreateSheetButton({required this.value, required this.label});
  final int value;
  final String label;

  static CreateSheetButton parse(int value) {
    /// 解析从后台传来的值
    if (value == 1) {
      return CreateSheetButton.space;
    }
    if (value == 2) {
      return CreateSheetButton.theme;
    }

    return CreateSheetButton.activity;
  }
}
  • 封装GetX的Get.bottomSheet实现底部Sheet的弹出;使用Get.back(result:T)回传数据。
/// 创建活动,空间,主题
class CreateSheet {
  /// 使用Get.back(result:T)回传数据
  static Future<T?> show<T>() {
    return Get.bottomSheet(
      Container(
        height: 300.h,
        decoration: BoxDecoration(
          color: StyleUtils.backgroundColor7,
          borderRadius: BorderRadius.only(
            topLeft: Radius.circular(15.r),
            topRight: Radius.circular(15.r),
          ),
        ),
        padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 10.h),
        child: Column(
          children: [
            GestureDetector(
              behavior: HitTestBehavior.opaque,
              onTap: () {
                Get.back(result: CreateSheetButton.activity);
              },
              child: Container(
                decoration: BoxDecoration(
                  color: StyleUtils.backgroundColor5,
                  borderRadius: BorderRadius.all(Radius.circular(10.r)),
                ),
                height: 50.h,
                child: Center(
                  child: Text(
                    CreateSheetButton.activity.label,
                    style: StyleUtils.textStyle01,
                  ),
                ),
              ),
            ),
            SizedBox(
              height: 10.h,
            ),
            GestureDetector(
              behavior: HitTestBehavior.opaque,
              onTap: () {
                Get.back(result: CreateSheetButton.space);
              },
              child: Container(
                decoration: BoxDecoration(
                  color: StyleUtils.backgroundColor5,
                  borderRadius: BorderRadius.all(Radius.circular(10.r)),
                ),
                height: 50.h,
                child: Center(
                  child: Text(
                    CreateSheetButton.space.label,
                    style: StyleUtils.textStyle01,
                  ),
                ),
              ),
            ),
            SizedBox(
              height: 10.h,
            ),
            GestureDetector(
              behavior: HitTestBehavior.opaque,
              onTap: () {
                Get.back(result: CreateSheetButton.theme);
              },
              child: Container(
                decoration: BoxDecoration(
                  color: StyleUtils.backgroundColor5,
                  borderRadius: BorderRadius.all(Radius.circular(10.r)),
                ),
                height: 50.h,
                child: Center(
                  child: Text(
                    CreateSheetButton.theme.label,
                    style: StyleUtils.textStyle01,
                  ),
                ),
              ),
            ),
            SizedBox(
              height: 30.h,
            ),
            GestureDetector(
              behavior: HitTestBehavior.opaque,
              onTap: () {
                Get.back(result: PopCommonButton.cancel);
              },
              child: Container(
                decoration: BoxDecoration(
                  color: StyleUtils.backgroundColor5,
                  borderRadius: BorderRadius.all(Radius.circular(10.r)),
                ),
                height: 50.h,
                child: Center(
                  child: Text(
                    PopCommonButton.cancel.label,
                    style: StyleUtils.textStyle01,
                  ),
                ),
              ),
            ),
            SizedBox(
              height: 30.h,
            ),
          ],
        ),
      ),
    );
  }
}
  • 使用的地方加一个await就可以了
      var result = await CreateSheet.show();
      LogUtil.log("CreateSheet返回值:$result");
      if (result == CreateSheetButton.activity) {
        /// 点了活动按钮
      }
      if (result == CreateSheetButton.space) {
        /// 点了空间按钮
      }
      if (result == PopCommonButton.cancel) {
        /// 点了取消按钮
      }
  • 至于Alert,封装方式和Sheet类似,只要把方法换成Get.dialog就可以了。

相关文章

  • Flutter 重构:基于 PopupRoute 的极简弹窗

    这可能是颗粒度最好的 PopupRoute 弹窗封装。 核心: Flutter 需要自定义各式各样的弹窗视图,总是...

  • Log.cat && Toast 工具封装

    打印和弹窗的工具封装

  • iOS | 对封装自定义弹窗的一点思考

    iOS | 对封装自定义弹窗的一点思考 iOS | 对封装自定义弹窗的一点思考

  • Flutter 自定义弹窗组件

    弹窗组件的封装思路 封装的弹窗必须要灵活,满足实际开发中的大部分弹窗,比如有无标题、有无内容、有无关闭按钮、有无操...

  • iOS开发通用弹窗

    根据app的通用弹窗视觉封装了通用弹窗模板。 弹窗可以定制title文字、message文字、leftBtnTit...

  • iOS | 对封装自定义弹窗的一点思考

    背景 由于项目原因,经常需要封装自定义弹窗。 最开始我封装自定义弹窗的思路是在[UIApplication sha...

  • Flutter 弹窗

    1、showDialogshowDialog:半透明背景弹窗 打电话弹窗:AlertDialog:alert内容B...

  • flutter弹窗

    一、iOS风格弹窗 风格一: 风格二: 风格三: 风格四:底部 二、GetX的Dialog风格 1、自定义的 2、...

  • flutter弹窗插件 -- oktoast

    flutter 开发中常用的弹窗插件oktoast,使用非常简单插件地址:oktoast | Flutter Pa...

  • 弹窗的封装

    对于一般的弹窗,比如只有一句信息和两个按钮(确定和取消),这种操作经常用到,如果每个地方都用要写一遍,很浪费时间,...

网友评论

      本文标题:Flutter之弹窗封装 2024-11-19 周二

      本文链接:https://www.haomeiwen.com/subject/pxsmjjtx.html