Flutter高仿微信-第22篇-支付-二维码收款(二维码)

news2024/12/26 0:53:18

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。

详情请查看

效果图:

实现代码:

/**
 * Author : wangning
 * Email : maoning20080809@163.com
 * Date : 2022/10/27 15:21
 * Description : 二维码收款
 */

class QRCodeReceive extends StatefulWidget {

  @override
  State<StatefulWidget> createState() => _QRCodeState();

}

class _QRCodeState extends State<QRCodeReceive> with TickerProviderStateMixin{

  String account = SpUtils.getString(CommonUtils.LOGIN_ACCOUNT);
  UserBean? _userBean;
  String? qrCode;
  //是否隐藏金额
  bool isHideAmount = true;
  //设置返回的金额
  //String setAmount = "";

  UserBean? _fromUserBean;
  PaymentBean? _paymentBean;

  String qrBalance = "";

  late Animation<double> _animation;
  late AnimationController _controller;
  var baseEvent;

  @override
  void initState() {
    super.initState();
    _initAnimator();
    _initBaseEvent();
    initUser();
  }


  void _initAnimator(){
    /// 动画控制器,动画持续时间5秒,可重复播放
    _controller = AnimationController(
      duration: const Duration(seconds: 1),
      vsync: this,
    );
    /// 缩小至 0.2倍大小,放大至3倍大小 非线性动画
    _animation = Tween<double>(begin: 1, end: 1.3).animate(
      CurvedAnimation(
        parent: _controller,
        curve: Curves.easeInCirc,
      ),
    );

    _controller.addStatusListener((status) {
      if(status == AnimationStatus.completed){
        _controller.reverse();
      }
    });
  }

  void _startAnimator(){
    _controller.forward();
  }

  void _initBaseEvent() async {
    baseEvent = eventBus.on<BaseEvent>((baseBean) {
      //显示对方头像信息
      if(baseEvent != null && baseBean.type == BaseEvent.TYPE_QRCODE_PAYMENT){
        Map<String, Object> result = baseBean.result;
        _paymentBean =  result['payment_bean'] as PaymentBean;
        _initFromUser(_paymentBean);
      }
    });
  }

  void initUser() async {
    _fromUserBean = await UserRepository.getInstance().findUserByAccount(_paymentBean?.fromAccount??"");
    _userBean = await UserRepository.getInstance().findUserByAccount(account);

    _refreshQRCode();
  }

  void _refreshQRCode(){
    if(qrBalance == ""){
      qrCode = CommonUtils.QR_RECEIVE_CODE + "0" + ":" + account;
    } else {
      qrCode = CommonUtils.QR_RECEIVE_CODE + qrBalance + ":" + account;
    }
    setState(() {
    });
  }

  void _initFromUser(PaymentBean? _paymentBean) async {
    _fromUserBean = await UserRepository.getInstance().findUserByAccount(_paymentBean?.fromAccount??"");
    _startAnimator();
    setState(() {
    });
  }

  //设置金额
  void _setAmount() async{
    qrBalance = await Navigator.push(context, MaterialPageRoute(builder: (context) => QRCodeSetAmount()));
    isHideAmount = false;
    _refreshQRCode();
  }

  @override
  void dispose() {
    super.dispose();
    eventBus.off(baseEvent);
    _controller.dispose();

  }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      body: Container(
        width: double.infinity,
        height: double.infinity,
        color: Color(0xffFFD700),
        child: Column(
          children: [
            topWidget(),
            qrcodeReceiveWidget(),
            userInfo(),
          ],
        ),
      ),
    );
  }

  //顶部返回栏
  Widget topWidget(){
    double appBarHeight = AppManager.getInstance().getAppBarHeight();
    double top = AppManager.getInstance().getTop(context);
    double height = appBarHeight + top;
    return Container(
      margin: EdgeInsets.only(left:12, top: top, right: 12),
      height: height,
      alignment: AlignmentDirectional.center,
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          InkWell(
            onTap: (){
              Navigator.pop(context);
            },
            child: Icon(Icons.arrow_back_ios,color: Colors.white,size: 26,),
          ),
          Text("二维码收款", style: TextStyle(fontSize: 22, color: Colors.white, fontWeight: FontWeight.bold),),
          Text(""),
        ],
      ),
    );
  }

  //向商家付款
  Widget qrcodeReceiveWidget(){
    return Container(
      margin: EdgeInsets.only(left: 12, top: 10, right: 12),
      width: double.infinity,
      height: AppManager.getInstance().getWidth(context),
      color: Colors.white,
      child: Stack(
        children: [
          Positioned(
            left:8, top: 8,
            child: Row(
              children: [
                CommonUtils.getBaseIconPng("wc_qrcode_receive_icon", width: 30, height: 30),
                SizedBox(width: 10,),
                Text("二维码收款", style: TextStyle(fontSize: 20, color: Color(0xFFFFD700)),),
              ],
            ),
          ),

          Positioned(
            left: 0,  top: 50, right :0,
              child: Container(
                alignment: AlignmentDirectional.center,
                child: Text("无需加好友,扫收款码向我付钱", style: TextStyle(color: Colors.grey.shade600),),
              ),
          ),

          Positioned(
            left: 0,  top: 80, right :0,
            child: Offstage(
              offstage: isHideAmount,
              child: Container(
                alignment: AlignmentDirectional.center,
                child: Text(qrBalance, style: TextStyle(fontSize: 26, color: Colors.black, fontWeight: FontWeight.bold),),
              ),
            ),
          ),

          Center(
            child: getQrWidget(),
          ),

          Positioned(
            left: 80, bottom: 50,
            child: InkWell(
              onTap: (){
                _setAmount();
              },
              child: Text("设置金额", style: TextStyle(fontSize: 16, color: Colors.black),)
            ),
          ),

          Positioned(
              right: 80, bottom: 50,
              child: Text("保存收款码", style: TextStyle(fontSize: 16, color: Colors.black),)
          ),

        ],
      ),
    );
  }

  //付款用户头像信息
  Widget userInfo(){
    return Offstage(
      offstage: _fromUserBean == null?true:false,
      child: Container(
        margin: EdgeInsets.only(left: 12, top: 10, right: 12),
        padding: EdgeInsets.only(bottom: 10),
        width: double.infinity,
        color: Colors.white,
        child: ScaleTransition(
          scale: _animation,
          child: Container(
            margin: EdgeInsets.only(left: 12, top:10, right: 22),
            child: Row(
              children: [
                CommonAvatarView.showBaseImage(_fromUserBean?.avatar??""),
                SizedBox(width:10),
                Text(_fromUserBean?.nickName??"", style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),),
                Expanded(child: Text("")),
                Text("¥${_paymentBean?.balance}", style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
              ],
            ),
          ),
        ),
      ),
    );
  }

  //获取二维码图片
  Widget getQrWidget(){
    return QrImage(
      data: '${qrCode}',
      version: QrVersions.auto,
      size: 200,
      gapless: false,
      embeddedImage: CommonAvatarView.showQrImage(_userBean?.avatar??""),
      embeddedImageStyle: QrEmbeddedImageStyle(
        size: Size(38, 38),
      ),
    );
  }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装Jenkins并在ruby中访问

1. 安装Jenkins 最近不知道为啥&#xff0c;根据官网Linux安装Jenkins的时候下不来安装包&#xff0c;提示连接超时。尝试多次无果后决定在window上安装 curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee /usr/share/keyrings/jenkins-keyring.as…

105-120-Hadoop-MapReduce-outputformat:

105-Hadoop-MapReduce-outputformat&#xff1a; OutputFormat 数据输出&#xff0c;OutputFormat接口实现类 OutputFormat是MapReduce输出的基类&#xff0c;所有实现MapReduce输出都实现了 OutputFormat 接口。下面我们介绍几种常见的OutputFormat实现类。 1&#xff0e;O…

Fiddler利用Edxposed框架+TrustMeAlready来突破SSL pinning抓取手机APP数据

一、背景 在使用fiddler做代理抓取应用数据包时&#xff0c;如果要抓取到HTTPS数据&#xff0c;需要将fiddler证书导入到浏览器或手机。浏览器或手机设置好fiddler的代理地址&#xff0c;即可抓取到https数据包。 如果APP应用采用证书锁定后&#xff0c;将无法抓取到https数据…

[附源码]java毕业设计医院档案管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

RabbitMQ 简介

RabbitMQ 简介 首先我们先看一下常见的MQ产品 在上图我们可以知道RabbitMQ和ActiveMQ都支持AMQP协议&#xff0c;那么什么时AMQP呢&#xff1f; AMQP&#xff0c;即 Advanced Message Queuing Protocol&#xff08;高级消息队列协议&#xff09;&#xff0c;是一个网络协议&a…

Android启动以及 app 启动流程 笔记

Android 启动流程 init 进程是 用户控件鼻祖 zygote 进程是 java进程鼻祖 zygote进程的操作 1.native 层 做的操作 1.初始化java运行环境 虚拟机 &#xff08;内存管理&#xff09; 2.注册jni 3.运行 zygoteinit.main方法 进入java 2.java …

Serverless Devs 社区联合信通院邀请您参加 2022 中国 Serverless 用户调查

作者&#xff1a;云原生产业联盟 在创新发展需求的不断驱动下&#xff0c;用户关注点逐步上移&#xff0c;敏捷成为破局高频竞争的利器。以应用为中心、屏蔽底层复杂逻辑&#xff0c;灵活扩展&#xff0c;按需取用的服务器无感知&#xff08;Serverless&#xff09;技术符合云…

【GUI视频教程】GUI综合实战视频教程第3期:GUIX Studio一条龙设计主界面,底栏和窗口切换控制(2022-11-21)

视频教程汇总帖&#xff1a;【学以致用&#xff0c;授人以渔】2022视频教程汇总&#xff0c;DSP第10期&#xff0c;ThreadX第5期&#xff0c;BSP驱动第24期&#xff0c;USB实战第4期&#xff0c;GUI实战第3期&#xff08;2022-11-21&#xff09; - STM32F429 - 硬汉嵌入式论坛 …

Dubbo 服务注册与启动源码解析

Dubbo 版本&#xff1a;3.1.2 自定义标签解析 在 DubboNamespaceHandler 中会添加 DubboDeployApplicationListener&#xff0c;其继承了 ApplicationListener<ApplicationContextEvent> 关于ApplicationListener&#xff0c;可参考&#xff1a;Spring 事件基本使用 服…

YoloV5+TensorRT封装|C#调用dll实现V5+TRT目标检测

在目标检测得领域中&#xff0c;yolo系列无疑是最强得目标检测框架&#xff0c;而其中得yolov5更是扛把子得存在&#xff0c;虽然有着众多的yolo系列版本&#xff0c;但是在工业领域中yolov5还是用的最多&#xff0c;yolov5 yyds&#xff0c;&#xff0c;&#xff0c;先奉献上我…

上海亚商投顾:沪指高开低走 钠离子电池、储能概念崛起

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日高开低走&#xff0c;收盘均小幅下跌&#xff0c;以中字头为首的权重股走弱&#xff0c;上证50跌超0.…

SpringBoot中如果字段为空就不返回给前端

SpringBoot中如果字段为空就不返回给前端前言测试参数的执行结果JsonInclude.Include.ALWAYSJsonInclude.Include.NON_NULLJsonInclude.Include.NON_ABSENTJsonInclude.Include.NON_EMPTYJsonInclude.Include.NON_DEFAULTJsonInclude.Include.USE_DEFAULTSJsonInclude.Include.…

2.(vue3.x+vite)使用vue-router

前端技术社区总目录(订阅之前请先查看该博客) 前端技术社区:vue3.x+vite,node篇,前端小技术,前端资料篇等相关内容的介绍 1:安装vue-router npm i vue-router 2:创建router文件 在src的目录下创建router文件夹与index.js文件 index.js文件内容如下: import {cr…

C#学习以及感受

我本来是写Java的,但是这边的代码用的是.NetCore框架 就自学了 但是学下来,发现其实这两者并没有什么本质区别 Java导包用import而c#用using Java与c#都是写一个静态的main方法来启动,c#的Main必须大写 Java和c#的数据类型基本一样,c#中的string的s可以小写,c#的布尔类型是bool…

Landsat Collection 2 T1一级数据详细介绍(数据处理过程和几何精度)

几项数据处理、几何和辐射改进&#xff0c;以及新的数据分发过程&#xff0c;定义了 Collection 2 Level-1 数据。此页面提供了有关用户可以在 Landsat Collection 2 Level-1 数据中找到的更改的详细信息。请参阅本页下方列出的特定于仪器的数据格式控制手册&#xff0c;以更全…

Redis基础命令(List类型)双链表

目录 概述&#xff1a; 特征&#xff1a;&#xff08;与LinkedList类似&#xff09; List常见命令 1.Lpush key element.....&#xff1a;向列表左侧插入一个或多个元素 2.LPOP key &#xff1a;移除并返回列表左侧的第一个元素&#xff0c;没有则返回nil 3.RPUSH key ele…

【allegro 17.4软件操作保姆级教程四】布线前准备之叠层和阻抗设计

通常在设计中&#xff0c;如果我们有控制阻抗的要求&#xff0c;一般会在加工工艺文档里进行说明&#xff0c;板厂拿到文档和相关工程文件后&#xff0c;会进行工程评估确认&#xff0c;会根据板厂的实际情况进行叠层和线宽的调整&#xff0c;所以这里只是进行简单分析&#xf…

sqli-labs/Less-59

这一关又只有五次机会 而且仍然是以id作为注入点 我们尽量再前一轮完成注入类型的判断 在后一轮完成各种爆破操作 首先先判断注入类型是否属于数字型注入 输入id1 and 12 回显如下 没有回显 说明后续操作不能使用报错注入解决问题 并且肯定是属于数字型注入 倒是有无修饰符不懂…

【javaEE】网络原理(数据链路层+小结)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言一、数据链路层1. 以太网2. 认识MTU&#xff08;没时间可以跳过&#xff09;3. 认识ARP&#xff08;没时间就跳过&#xff09;二、 【网络原理小结】&#xff08;含面试题&#xff09;THINK前言 一个人最大的痛…

搭建vue3.2+vite+ts+pinia项目

用到的技术 vue3.2vitetspinia 搭建项目 前言 vue3vite 会比vue2webpack的速度快很多&#xff1b;Vite 是一个轻量级的、速度极快的构建工具&#xff1b; vite官网 创建项目 npm create vitelatest报错了&#xff1a; 初始化失败 npm ERR! Could not install from “File…