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);

  }
相关推荐
我不会插花弄玉10 分钟前
7.函数【由浅入深-MySQL】
android·数据库·mysql
vilya1 小时前
手机端 Agent 怎么动起来:Kotlin 与 Python 之间的桥
android·agent
高晶1 小时前
Android 新手实战:从零搭建 WebRTC 在线直播系统
android·程序员
alexhilton1 小时前
为什么你的 LazyColumn 仍然卡顿
android·kotlin·android jetpack
>Andre<2 小时前
系统架构全景
android
大龄秃头程序员5 小时前
Riverpod 深度解析:从响应式本质到最小可运行闭环
flutter
曹小强wxx6 小时前
让 AI 写代码不“翻车”:用 Claude Code + Codex 给 Flutter 项目搭一套工程规范
flutter·ai编程·claude
hai_android7 小时前
Android 嵌套滑动冲突:内部拦截 vs 外部拦截实战
android·android studio·android jetpack
木子欢儿8 小时前
Zabbix 7.4 Alpine 版 Docker Compose 部署
android·运维·docker·容器·zabbix
素师良码9 小时前
第9篇:Android驱动踩坑实录:DSI RX FIFO前置脏0、数据错位复盘
android