flutter实现付费解锁内容的遮挡

dart 复制代码
import 'package:configs/PathConfig.dart';
import 'package:utils/JadeColors.dart';
import 'package:utils/Utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

class ContentMask extends StatelessWidget{
  final String text;//文本字符串
  final double percent;//显示的百分比
  const ContentMask({super.key,required this.text,this.percent = 1.0});

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Column(
      children: [
        Text(getFirstPercentStr()),
        Container(
          padding: EdgeInsets.only(top: 60.w,bottom: 40.w),
          decoration: BoxDecoration(
            color: Colors.white,
            boxShadow: [
              BoxShadow(
                color: JadeColors.white.withValues(alpha: 0.9), // 阴影颜色(半透明)
                offset: const Offset(0, -5), // 向上偏移5px(y轴负数)
                blurRadius: 10, // 模糊半径(阴影扩散范围)
                spreadRadius: 10, // 扩散半径,这个参数可以让阴影扩散到上面的Text文本上(阴影基础大小)
                blurStyle: BlurStyle.normal, // 模糊样式
              ),
            ],
          ),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Row(
                mainAxisSize: MainAxisSize.min,
                children: [
                  Image.asset(PathConfig.iconShieldGold,width: 52.w),
                  Text('真实性保障,不实即退!',style: TextStyle(fontSize: 30.sp,fontWeight: FontWeight.bold))
                ],
              ),
              Text('解锁后您将获得:',style: TextStyle(fontSize: 26.sp,height: 3)),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  Column(
                    children: [
                      Image.asset(PathConfig.iconSelectedGold,width: 40.w),
                      Text('具体的操作细节',style: TextStyle(fontSize: 26.sp,height: 2))
                    ],
                  ),
                  Column(
                    children: [
                      Image.asset(PathConfig.iconSelectedGold,width: 40.w),
                      Text('隐藏的优惠券口令',style: TextStyle(fontSize: 26.sp,height: 2))
                    ],
                  ),
                  Column(
                    children: [
                      Image.asset(PathConfig.iconSelectedGold,width: 40.w),
                      Text('具体店铺地址',style: TextStyle(fontSize: 26.sp,height: 2))
                    ],
                  )
                ],
              ),
              GestureDetector(
                onTap: (){},
                child: Container(
                  color: JadeColors.orange_14,
                  padding: EdgeInsets.symmetric(horizontal: 50.w,vertical: 20.w),
                  margin: EdgeInsets.only(top: 40.w,bottom: 40.w),
                  child: Text('仅需 ¥ 5.00,即可解锁。',style: TextStyle(color: Colors.white,fontSize: 26.sp),),
                ),
              ),
              Text.rich(
                  TextSpan(
                      text: '已有',
                      style: TextStyle(color: JadeColors.grey,fontSize: 24.sp),
                      children: [
                        TextSpan(
                          text: '485',
                          style: TextStyle(color: JadeColors.grey_2,fontSize: 24.sp),
                        ),
                        TextSpan(
                          text: '人解锁',
                          style: TextStyle(color: JadeColors.grey,fontSize: 24.sp),
                        )
                      ]
                  )
              ),
              Container(
                margin: EdgeInsets.only(top: 30.w),
                height: 80.w,
                child: ListView.builder(
                    itemCount: 6,
                    shrinkWrap: true,
                    scrollDirection: Axis.horizontal,
                    itemBuilder: (_,index){
                      return index == 5
                          ? Image.asset(PathConfig.iconThreeDotOrange,width: 75.w)
                          : Container(
                        color: Colors.transparent,
                        margin: EdgeInsets.only(right: 10.w),
                        child: Stack(
                          alignment: Alignment.topRight,
                          children: [
                            Padding(padding: EdgeInsets.only(right: 16.w,top: 4.w),
                                child: Utils().roundedImage(PathConfig.testImageUrl[3], 60,width: 75.w,height: 75.w)),
                            Container(
                              padding: EdgeInsets.symmetric(horizontal: 6.w,vertical: 2.w),
                              decoration: BoxDecoration(
                                  color: JadeColors.gold_11,
                                  border: Border.all(color: JadeColors.gold_12,width: 1),
                                  borderRadius: BorderRadius.circular(10)
                              ),
                              child: Text('已解锁',style: TextStyle(color: JadeColors.gold_12,fontSize: 12.sp)),
                            )
                          ],
                        ),
                      );
                    }),
              )
            ],
          ),
        )
      ],
    );
  }

  String getFirstPercentStr() {
    final chars = text.characters;
    int endIndex = (chars.length * percent).floor().clamp(1, chars.length);
    return chars.take(endIndex).toString();
  }
}

使用

dart 复制代码
bool _isFree = false; //是否免费
  //内容
  _contentView(){
    return _isFree ? Column(
      children: [
        Container(
          padding: EdgeInsets.only(top: 20.w,left: 20.w,right: 20.w),
          child: Text(_testContext, style: TextStyle(fontSize: 30.sp),),
        ),
        _addressView(),
      ],
    ):ContentMask(text: _testContext,percent: 0.4);

  }
相关推荐
进击的cc2 小时前
拒绝背诵!一文带你打穿 Android ANR 发生的底层全链路
android·面试
进击的cc2 小时前
App 启动优化全家桶:别再只盯着 Application 了,热启动优化你真的做对了吗?
android·面试
彭波3962 小时前
安卓手机端安装xapk、apkm软件!怎样安装xapk软件?安卓的apk和XAPK的区别?附教程
android·智能手机
Yang-Never3 小时前
ADB ->adb shell perfetto 抓取 trace 指令
android·开发语言·adb·android studio
tangweiguo030519874 小时前
Flutter iOS 调试利器:idevicesyslog 从入门到精通
flutter
2501_937189236 小时前
莫凡电视:地方台专属聚合 稳定直播播放工具
android·源码·源代码管理
tangweiguo030519877 小时前
Flutter 异常捕获与处理:从入门到生产实践
flutter
耶叶7 小时前
Android 新权限申请模型(Activity Result API)
android
阿拉斯攀登7 小时前
【RK3576 安卓 JNI/NDK 系列 04】JNI 核心语法(下):字符串、数组与对象操作
android·驱动开发·rk3568·瑞芯微·rk安卓驱动·jni字符串操作