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
相关产品推荐
相关产品推荐

