Flutter高仿微信-第21篇-支付-向商家付款(二维码)

news2024/11/14 6:02:40

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

详情请查看

效果图:

实现代码:

/**
 * Author : wangning
 * Email : maoning20080809@163.com
 * Date : 2022/10/25 23:20
 * Description : 向商家付款
 */

class ReceivePayment extends StatefulWidget {

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

}

class _ReceivePaymentState extends State<ReceivePayment> with TickerProviderStateMixin{

  PaymentBean? _paymentBean;
  UserBean? _fromUserBean;
  String? qrCode;
  var baseEvent;
  late Animation<double> _animation;
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _initAnimator();

    _initBaseEvent();

    String account = SpUtils.getAccount();
    qrCode = CommonUtils.QR_PAYMENT_CODE + account;
  }

  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_MERCHANT_PAYMENT){
        Map<String, Object> result = baseBean.result;
        _paymentBean =  result['payment_bean'] as PaymentBean;
        _initFromUser(_paymentBean);
      }
    });
  }

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

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

  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(

      body: Container(
        color: Color(0xFF48d17a),
        width: double.infinity,
        height: double.infinity,
        child: Column(
          children: [
            topWidget(),
            merchantsWidget(),
            merchantInfo(),
            qrCodeReceiveWidget(),
          ],
        ),
      ),

    );
  }

  //顶部返回栏
  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 merchantsWidget(){
    return Container(
      margin: EdgeInsets.only(left: 12, top: 10, right: 12),
      width: double.infinity,
      height: AppManager.getInstance().getWidth(context) - 50,
      color: Colors.white,
      child: Stack(
        children: [
          Positioned(
            left:8, top: 8,
            child: Row(
              children: [
                CommonUtils.getBaseIconPng("wc_receive_payment_icon", width: 30, height: 30),
                SizedBox(width: 10,),
                Text("向商家付款", style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold, color: Color(0xFF48d17a)),),
              ],
            ),
          ),

          Center(
            child: getQrWidget(),
          ),

        ],
      ),
    );
  }

  //商家头像信息
  Widget merchantInfo(){
    return Offstage(
      offstage: _fromUserBean == null?true:false,
      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, color: Colors.white)),
            ],
          ),
        ),
      ),
    );
  }

  //获取二维码图片
  Widget getQrWidget(){
    return QrImage(
      data: '${qrCode}',
      version: QrVersions.auto,
      size: 200,
      gapless: false,
    );
  }

  //二维码收款
  Widget qrCodeReceiveWidget(){
    return InkWell(
      onTap: (){
        Navigator.push(context, MaterialPageRoute(builder: (context) => QRCodeReceive()));
      },
      child: Container(
        margin: EdgeInsets.only(left: 12, top: 20, right: 12),
        child: Row(
          children: [
            CommonUtils.getBaseIconPng("wc_receive_payment_item_icon", width: 30, height: 30),
            SizedBox(width: 10,),
            Text("二维码收款", style: TextStyle(fontSize: 20, color: Colors.white),),
            Expanded(child: Text("")),
            Icon(Icons.chevron_right,color: Colors.white,size: 40,)
          ],
        ),
      ),
    );
  }

}

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

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

相关文章

IntelliJ IDEA-Debug断点调试 看这篇文章就够了

详解IntelliJ IDEA-Debug断点调试 如今&#xff0c;IntelliJ IDEA 目前深受广大开发者喜爱&#xff0c;我们在实际开发工作中&#xff0c;不管是用来阅读源码还是在开发过程中都需要进行代码调试。 以下为大家准备了一篇关于IntelliJ IDEA-Debug断点调试的文章&#xff0c;如…

嗨 Jina,帮我画一幅高山流水图

本项目将 Whisper 与 Stable Diffusion 模型结合&#xff0c;可以直接完成语音生成图像的任务。用户可以语音输入一个短句&#xff0c;Whisper 会自动将语音转化为文本&#xff0c;接着&#xff0c;Stable Diffusion 会根据文本生成图像。 本项目基于 Jina AI MLOps 平台搭建&a…

一个Python爬虫案例,带你掌握xpath数据解析方法!

文章目录 xpath基本概念xpath解析原理环境安装如何实例化一个etree对象&#xff1a;xpath(‘xpath表达式’)xpath爬取58二手房实例爬取网址完整代码效果图xpath图片解析下载实例爬取网址完整代码效果图xpath爬取全国城市名称实例爬取网址完整代码效果图xpath爬取简历模板实例爬…

【pygame学习+实战】第一篇:游戏最小系统

14天学习训练营导师课程&#xff1a; 李宁《Python Pygame游戏开发入门与实战》 李宁《计算机视觉OpenCV Python项目实战》1 李宁《计算机视觉OpenCV Python项目实战》2 李宁《计算机视觉OpenCV Python项目实战》3 文章目录前言一、什么是pygame&#xff1f;1.1 学习pygame的用…

当我们谈论DDD时我们在谈论什么

谈论到 DDD&#xff0c;我们会聊事件风暴&#xff0c;会聊限界上下文&#xff0c;会聊六边形架构&#xff0c;会聊实体值对象。这些概念各不相同&#xff0c;相关的概念也很不一样&#xff0c;但都属于DDD的范畴。见过了很多DDD的讨论和工作坊&#xff0c;我发现大家唇枪舌剑无…

【同时完成超分和MEF】

Deep Coupled Feedback Network for Joint Exposure Fusion and Image Super-Resolution &#xff08;用于联合曝光融合和图像超分辨的深度耦合反馈网络&#xff09; 如今&#xff0c;人们已经习惯了拍照来记录自己的日常生活&#xff0c;然而&#xff0c;照片实际上与真实的…

SB30100LCT-ASEMI插件肖特基二极管SB30100LCT

编辑-Z SB30100LCT在TO-220AB封装里采用的2个芯片&#xff0c;其尺寸都是94MIL&#xff0c;是一款插件肖特基二极管。SB30100LCT的浪涌电流Ifsm为200A&#xff0c;漏电流(Ir)为12uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。SB30100LCT采用金属硅芯片材质&#xff0c;里…

解决OpenCV在Cmake时,因网络问题无法下载部分所需文件

解决OpenCV在Cmake时&#xff0c;因网络问题无法下载部分所需文件 在安装CUDA-Opecv进行Cmake的过程中&#xff0c;因为网络问题很多文件都无法下载。可以在你的opencv/.cache下可以看到&#xff0c;很多文件都是0kb的。这样肯定是不行的&#xff0c;我们要保证每个文件都要下…

深入 category 数据类型

目录 前言 1 作用 2 用法 2.1通过 pd.Categorical 创建 category 类型数据&#xff0c;同时指定可选项 2.2 通过 dtype 参数创建 category 类型数据 2.3 此时对数据进行排序 2.4 通过 CategoricalDtype 指定 category 数据的类型顺序 2.5 想要临时修改排序规则&…

低代码开发是未来软件开发的主流模式

低代码平台起始于20世纪80年代4GL“第四代编程语言”。2014年&#xff0c;Forrester research 提出低代码平台的概念&#xff0c;中国低代码市场进入发展期&#xff1b;2018 年&#xff0c;西门子收购低代码企业 Mendix 、美国低代码独角兽企业 Outsystem 获得 1.5 亿美元的融资…

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

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** Author : wangning* Email : maoning20080809163.…

安装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 事件基本使用 服…