【问题标题】:Disable drag down to close showModalBottomSheet禁用向下拖动以关闭 showModalBottomSheet
【发布时间】:2019-02-18 08:58:27
【问题描述】:

如何禁用/退出底部表单模态中的向下拖动手势,以便用户可以在模态中进行交互而不会意外关闭模态?

在下面用实际的模态底页更新。

return showModalBottomSheet(
    context: context,
    builder: (BuildContext context) {
        ...
    }
}

【问题讨论】:

    标签: dart flutter modal-dialog gesture


    【解决方案1】:

    将enableDrag 设置为false

    bool enableDrag

    如果为 true,则底部工作表可以上下拖动并通过向下滑动来消除。

    https://docs.flutter.io/flutter/material/BottomSheet/enableDrag.html

    【讨论】:

    • 谢谢,我不知道有一个实际的 BottomSheet。不幸的是,没有 BottomSheet 用例“BottomSheet 小部件本身很少直接使用”的示例。您是否可以创建一个行为类似于 Modal showModalBottomSheet 版本的示例?
    • 试试this。致谢:here
    • 嗯.. 两个链接都不使用BottomSheet
    • 在使用 enableDrag 搜索词进行额外的 Google 搜索时,我实际上找不到任何使用该属性的示例。
    • 似乎 enableDrag 属性在主频道中可用。尚未在马厩上提供
    【解决方案2】:

    您可以尝试使用带有 onVerticalDragStart = (_) {} 的 GestureDetector 包装构建器的结果{}

    showModalBottomSheet(
      context: context,
      builder: (context) => GestureDetector(
        child: **any_widget_here**,
        onVerticalDragStart: (_) {},
      ),
      isDismissible: false,
      isScrollControlled: true,
    );
    

    【讨论】:

    • 这很聪明:D 它非常适合持久性底页,谢谢
    • flutter 通道稳定的简单解决方案
    【解决方案3】:

    如果您仍然希望在模态框内滚动而不需要用户拖动并关闭它,您可以使用这个:

                      showModalBottomSheet(
                        context: context,
                        enableDrag: false,
                        shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.vertical(
                            top: Radius.circular(20),
                          ),
                        ),
                        clipBehavior: Clip.antiAliasWithSaveLayer,
                        builder: (context) => DraggableScrollableSheet(
                          expand: false,
                          initialChildSize: 0.9,
                          minChildSize: 0.5,
                          maxChildSize: 0.9,
                          builder: (context, scrollController) {
                            return SingleChildScrollView(
                              child: new Container(
                                color: Colors.white,
                                child: buildTitleWidget(),
                              ),
                            );
                          },
                        ),
                        isDismissible: false,
                        isScrollControlled: true,
                      );
    

    诀窍是不要将scrollController添加到SingleChildScrollView

                          builder: (context, scrollController) {
                            return SingleChildScrollView(
                              controller: scrollController            <-- HERE
                              child: new Container(
                                color: Colors.white,
                                child: buildTitleWidget(),
                              ),
                            );
                          },
    

    【讨论】:

      猜你喜欢
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      • 2019-10-25
      • 2019-11-12
      • 2015-05-31
      • 1970-01-01
      相关资源
      最近更新 更多