Flutter实现直播间礼物收发

简介: 下面是一个简单的礼物发送系统的实现代码,包括支持连送和单次送等功能

下面是一个简单的礼物发送系统的实现代码,包括支持连送和单次送等功能:

import 'package:flutter/material.dart';
class Gift {
  final String name;
  final int count;
  Gift(this.name, this.count);
}
class GiftSendingScreen extends StatefulWidget {
  const GiftSendingScreen({Key? key}) : super(key: key);
  @override
  _GiftSendingScreenState createState() => _GiftSendingScreenState();
}
class _GiftSendingScreenState extends State<GiftSendingScreen> {
  List<Gift> _gifts = [
    Gift('Heart', 1),
    Gift('Rose', 1),
    Gift('Candy', 1),
    Gift('Teddy Bear', 5),
    Gift('Diamond Ring', 10),
  ];
  Gift? _selectedGift;
  int _sendingCount = 1;
  bool _isSendingContinuously = false;
  void _sendGift() {
    if (_selectedGift != null) {
      for (int i = 0; i < _sendingCount; i++) {
        // simulate sending gift to server
        print('Sending gift ${_selectedGift!.name}...');
      }
      if (_isSendingContinuously) {
        // continue sending gifts after a delay
        Future.delayed(Duration(seconds: 1), () {
          _sendGift();
        });
      }
    }
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Send Gift'),
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          DropdownButtonFormField<Gift>(
            decoration: InputDecoration(
              labelText: 'Select a gift',
            ),
            value: _selectedGift,
            onChanged: (gift) {
              setState(() {
                _selectedGift = gift;
              });
            },
            items: _gifts
                .map(
                  (gift) => DropdownMenuItem<Gift>(
                    value: gift,
                    child: Text('${gift.name} (${gift.count})'),
                  ),
                )
                .toList(),
          ),
          TextFormField(
            keyboardType: TextInputType.number,
            decoration: InputDecoration(
              labelText: 'Sending count',
            ),
            initialValue: '1',
            onChanged: (value) {
              setState(() {
                _sendingCount = int.tryParse(value) ?? 0;
              });
            },
          ),
          Row(
            children: [
              Checkbox(
                value: _isSendingContinuously,
                onChanged: (value) {
                  setState(() {
                    _isSendingContinuously = value ?? false;
                  });
                },
              ),
              Text('Send continuously'),
            ],
          ),
          ElevatedButton(
            onPressed: _sendGift,
            child: Text('Send'),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们使用了 Flutter 的 DropdownButtonFormFieldTextFormField 等组件来获取用户选择的礼物和发送数量。我们还使用了 Checkbox 组件来允许用户选择是否连续发送礼物。在 _sendGift() 方法中,我们模拟将礼物发送到服务器,并且如果用户选择了连续发送,我们将延迟一秒钟后再次调用该方法以持续发送礼物。

以下是一个简单的收到礼物系统的实现代码,支持展示连送和单次送等数量:

import 'package:flutter/material.dart';
class ReceivedGift {
  final String name;
  final int count;
  ReceivedGift(this.name, this.count);
}
class GiftReceivingScreen extends StatefulWidget {
  const GiftReceivingScreen({Key? key}) : super(key: key);
  @override
  _GiftReceivingScreenState createState() => _GiftReceivingScreenState();
}
class _GiftReceivingScreenState extends State<GiftReceivingScreen> {
  List<ReceivedGift> _receivedGifts = [];
  void _receiveGift(ReceivedGift gift) {
    setState(() {
      // check if the same gift is already received
      var existingGift = _receivedGifts.firstWhere(
        (g) => g.name == gift.name,
        orElse: () => null,
      );
      if (existingGift != null) {
        // increment count of existing gift
        _receivedGifts[_receivedGifts.indexOf(existingGift)] =
            ReceivedGift(gift.name, existingGift.count + gift.count);
      } else {
        // add new gift to received gifts list
        _receivedGifts.add(gift);
      }
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Received Gifts'),
      ),
      body: ListView.builder(
        itemCount: _receivedGifts.length,
        itemBuilder: (BuildContext context, int index) {
          var receivedGift = _receivedGifts[index];
          // build text based on number of gifts received
          var text = '${receivedGift.name} received';
          if (receivedGift.count > 1) {
            text += ' (${receivedGift.count}';
            text += receivedGift.count > 2 ? ' times)' : ' time)';
          }
          return ListTile(
            title: Text(text),
          );
        },
      ),
    );
  }
}

在这个示例中,我们使用了一个 _receivedGifts 列表来追踪用户收到的礼物。在 _receiveGift() 方法中,我们检查是否已经收到过相同的礼物,如果是,则增加现有礼物的数量;否则,将新礼物添加到列表中。

build() 方法中,我们使用 ListView.builder 来构建收到的礼物列表,并根据礼物数目构建展示文本。例如,如果用户收到多次相同礼物,则文本为“礼物名称接收(次数)”。

相关文章
|
缓存 运维 Java
nacos常见问题之点击下线提示报错如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
553 2
|
5月前
|
人工智能 开发者
阿里云百炼X支付宝:「AI打赏」功能上线,Agent变现更灵活🎉🎉🎉
阿里云百炼平台联合支付宝,推出业内首个Agent「AI打赏」功能,开发者可为应用一键配置赞赏功能,用户打赏金额将直接转入开发者支付宝账户,助力快速变现。
591 1
|
4月前
|
JSON 监控 API
在线网络PING接口检测服务器连通状态免费API教程
接口盒子提供免费PING检测API,可测试域名或IP的连通性与响应速度,支持指定地域节点,适用于服务器运维和网络监控。
|
JavaScript 应用服务中间件 nginx
【报错】nginx部署项目后Echarts折线图无法展示
在Vue3+TS+Arco项目中,打包后使用Nginx部署的Echarts折线图显示异常,报`Cannot read properties of undefined(reading &#39;setOption&#39;)`错误。问题源于在定义div时使用了Vue2的`$refs`语法,导致DOM元素无法正确初始化Echarts。解决方法有两种:1) 不推荐使用`document.getElementById`获取DOM并初始化Echarts;2) 推荐在Vue3中通过`ref`获取DOM,在`onMounted`中使用`echarts.init`并借助`nextTick`异步绘制数据。
408 3
|
9月前
|
缓存 视频直播
flutter3-dart3-dymall原创仿抖音(直播+短视频+聊天)商城app系统模板
基于最新版flutter3.27+dart3.x+Getx+mediaKit原创实战研发抖音app带货商城项目。集成了直播+短视频+聊天三大功能模块。实现了类似抖音app首页全屏沉浸式联动左右滑动页面模块、上下滑动短视频。
374 1
|
10月前
|
Dart 前端开发 容器
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
346 18
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
前端开发 小程序
新版校园跑腿外卖独立版+APP+小程序前端外卖配送平台源码
同城校园跑腿外卖配送平台源码,支持自定义diy 你可以设计你的页面,设计你自己的风格,支持多校园,独立版本,多商户,有用户端,骑手端,商家端,强大的功能
608 3
|
数据采集 JavaScript 前端开发
同花顺股票数据逆向:Cookie加密和Hook注入
同花顺股票数据逆向:Cookie加密和Hook注入
1476 0
|
PHP 数据库
thinkphp实现分表,使用suffix和setSuffix获取不同分表信息报错解决
thinkphp实现分表,使用suffix和setSuffix获取不同分表信息报错解决
191 0
|
小程序 API
uni-app上传音频,图片步骤
uni-app上传音频,图片步骤
502 0