You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter 上滑组件(Sliding Up)锁定实现:禁止关闭仅点击按钮解锁

上滑组件冻结仅按钮点击可关闭实现方案

核心实现分为2步:

  • 外层上滑组件默认禁用所有主动关闭能力(拖拽关闭、点击外部区域关闭)
  • 新增状态变量控制关闭权限,用户点击内部任意按钮时先解锁权限再执行关闭动作

第一步:配置外层上滑组件

如果你使用的是Flutter生态常用的sliding_up_panel第三方库,首先在State类中定义控制器和权限控制变量,再禁用默认关闭能力:

// 放在State类中
bool _canClosePanel = false;
final PanelController _panelController = PanelController();

// 外层SlidingUpPanel配置示例
SlidingUpPanel(
  controller: _panelController,
  isDraggable: _canClosePanel, // 仅允许有权限时拖拽
  backdropEnabled: false, // 禁用点击背景关闭
  // 保留你原有配置的minHeight、maxHeight、borderRadius等属性
  panel: // 这里放你现有写的上滑组件内容
)

如果你是自定义实现的上滑组件,直接在组件内部的关闭逻辑判断处增加_canClosePanel校验,仅变量为true时才执行关闭操作即可。

第二步:修改内部按钮点击逻辑

在你现有代码的两个按钮点击事件中,先解锁关闭权限,再执行原有业务逻辑,最后触发面板关闭:

@override
Widget build(BuildContext context) {
  return Container(
    color: Colors.white,
    child: _body(context),
  );
}

Widget _body(BuildContext context) {
  return Column(
    children: [
      Container(
        padding: EdgeInsets.symmetric(horizontal: w(30)),
        child: Column(
          children: [
            SizedBox(
              height: w(15),
            ),
            Lottie.asset('assets/lottie/privacy_policy.json', width: w(150)),
            SizedBox(
              height: w(20),
            ),
            GestureDetector(
              behavior: HitTestBehavior.opaque,
              onTap: () {
                AboutDetailsPage.show(
                    context, FlutterI18n.translate(context, "about.privacyPolicy"), PrivacyDetailsBody(), true);
              },
              child: Align(
                alignment: Alignment.centerLeft,
                child: Text(
                  FlutterI18n.translate(context, "about.privacyPolicyUpdateDescription"),
                  style: textStyle17().copyWith(color: TecnoColors.theme().grey1, height: 1.5),
                ),
              ),
            ),
          ],
        ),
      ),
      SizedBox(
        height: w(35),
      ),
      Container(
        padding: EdgeInsets.symmetric(horizontal: w(15)),
        child: Column(
          children: [
            Container(
              child: TecnoButton(
                FlutterI18n.translate(context, "about.privacyPolicyUpdateAllow"),
                backgroundColor: TecnoColors.theme().blue2,
                onTap: () {
                  // 解锁关闭权限
                  _canClosePanel = true;
                  setState(() {});
                  // 这里补充你点击同意后的业务逻辑
                  // 关闭上滑面板
                  _panelController.close();
                },
              ),
            ),
            SizedBox(
              height: w(15),
            ),
            Container(
              child: GestureDetector(
                onTap: () {
                  // 解锁关闭权限
                  _canClosePanel = true;
                  setState(() {});
                  // 原有退出登录逻辑保留
                  getUserBLoC(context).logout();
                  Navigator.pushReplacement(
                      context,
                      CupertinoPageRoute<Null>(
                        settings: RouteSettings(name: 'LoginPage'),
                        builder: (BuildContext context) => BoxLoginPage(loginPageMode.LOGIN),
                      ));
                  // 跳转登录页后可以选择关闭面板也可以不关闭
                  _panelController.close();
                },
                child: Text(
                  FlutterI18n.translate(context, "about.privacyPolicyUpdateDeny"),
                  style: textStyle16().copyWith(color: TecnoColors.theme().blue2),
                ),
              ),
            )
          ],
        ),
      )
    ],
  );
}

内容的提问来源于stack exchange,提问作者Rhonner Matheus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:21:03