From cffdc32553ff970a25404d6c9822f6797f62ae85 Mon Sep 17 00:00:00 2001 From: 18631081161 <2088094923@qq.com> Date: Mon, 2 Sep 2024 14:11:51 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=AD=E4=B9=B0=E9=81=93=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 2 +- android/app/src/main/AndroidManifest.xml | 2 - .../com/huanmeng/talk/EventBusParams.java | 20 ++ .../java/com/huanmeng/talk/MainActivity.java | 21 ++- .../talk/wxapi/WXPayEntryActivity.java | 11 +- lib/beans/character_info_bean.dart | 3 +- lib/beans/character_info_bean.g.dart | 2 + lib/beans/mall_item_bean.dart | 8 +- lib/beans/mall_item_bean.g.dart | 10 +- lib/beans/memory_card_bean.dart | 17 ++ lib/beans/memory_card_bean.g.dart | 21 +++ lib/common/EventBusUtil.dart | 42 +++++ lib/dialog/memory_card_dialog.dart | 79 +++++--- lib/dialog/prop_pay_dialog.dart | 173 ++++++++++++++++++ lib/main.dart | 15 +- lib/network/NetworkConfig.dart | 12 ++ lib/tools/chat/chat_model.dart | 47 ++++- lib/tools/chat/chat_page.dart | 108 +++++++---- lib/tools/find/recommend_page.dart | 7 +- lib/tools/home/home_chat_page.dart | 97 ++++++---- lib/tools/home/home_model.dart | 16 +- lib/tools/home/my_home_page.dart | 2 +- lib/tools/me/me_page.dart | 4 +- lib/tools/shop/account_page.dart | 143 +++++++++------ lib/tools/shop/shop_model.dart | 77 +++++++- lib/tools/shop/shop_page.dart | 103 ++++++++++- lib/tools/shop/transaction_page.dart | 6 +- pubspec.yaml | 2 + 28 files changed, 840 insertions(+), 210 deletions(-) create mode 100644 android/app/src/main/java/com/huanmeng/talk/EventBusParams.java create mode 100644 lib/beans/memory_card_bean.dart create mode 100644 lib/beans/memory_card_bean.g.dart create mode 100644 lib/common/EventBusUtil.dart create mode 100644 lib/dialog/prop_pay_dialog.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index de7d17b..76b4da1 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -80,7 +80,7 @@ dependencies { api 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.30' - api 'org.greenrobot:eventbus:3.1.1' + api 'org.greenrobot:eventbus:3.3.1' } flutter { diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index eaa9f63..03ccfff 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,8 +1,6 @@ - - map = new HashMap<>(); - map.put("wxPaySuccess", "wxPaySuccess"); - nativeChannel.invokeMethod("wxPaySuccess", map); + switch (event.message) { + case "wxPaySuccess": + Map map = new HashMap<>(); + map.put("wxPaySuccess", "wxPaySuccess"); + nativeChannel.invokeMethod("wxPaySuccess", map); + break; + + case "payError": + Map mapError = new HashMap<>(); + mapError.put("payError", "payError"); + nativeChannel.invokeMethod("payError", mapError); + break; } + } @@ -139,8 +148,8 @@ public class MainActivity extends FlutterActivity { Log.d("TAG", "handleMessage: payResult==" + payResult); Map map = new HashMap<>(); - map.put("AlipaySuccess", "AlipaySuccess"); - nativeChannel.invokeMethod("AlipaySuccess", map); + map.put("payError", "payError"); + nativeChannel.invokeMethod("payError", map); } break; diff --git a/android/app/src/main/java/com/huanmeng/talk/wxapi/WXPayEntryActivity.java b/android/app/src/main/java/com/huanmeng/talk/wxapi/WXPayEntryActivity.java index 64f9547..cb9d1eb 100644 --- a/android/app/src/main/java/com/huanmeng/talk/wxapi/WXPayEntryActivity.java +++ b/android/app/src/main/java/com/huanmeng/talk/wxapi/WXPayEntryActivity.java @@ -17,6 +17,7 @@ import com.tencent.mm.opensdk.openapi.WXAPIFactory; import org.greenrobot.eventbus.EventBus; + public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private final String APP_ID = "wxa4009a51b6438a06"; @@ -61,16 +62,19 @@ public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { case BaseResp.ErrCode.ERR_USER_CANCEL: //发送取消 Log.d("TAG", "取消支付"); + EventBus.getDefault().post(new MessageEvent("payError")); break; case BaseResp.ErrCode.ERR_AUTH_DENIED: //发送被拒绝 Log.d("TAG", "拒绝支付"); + EventBus.getDefault().post(new MessageEvent("payError")); break; case BaseResp.ErrCode.ERR_UNSUPPORT: //不支持错误 Log.d("TAG", "不支持支付"); + EventBus.getDefault().post(new MessageEvent("payError")); break; default: //发送返回 @@ -79,12 +83,5 @@ public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { } finish(); - -// Log.d("TAG", "onPayFinish, errCode = " + resp.errCode); -// if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { -// Log.d("TAG", "onPayFinish,errCode=" + resp.errCode); -// -// finish(); -// } } } diff --git a/lib/beans/character_info_bean.dart b/lib/beans/character_info_bean.dart index 1107138..0643142 100644 --- a/lib/beans/character_info_bean.dart +++ b/lib/beans/character_info_bean.dart @@ -17,9 +17,10 @@ class CharacterInfoBean { String? biography; String? prologue; List? label; + bool? memoryCardState; CharacterInfoBean(this.icon, this.intimacy, this.characterId, this.characterName, this.gender, this.lookCount, this.bgUrl, this.biography, - this.prologue, this.label); + this.prologue, this.label, this.memoryCardState); factory CharacterInfoBean.fromJson(Map json) => _$CharacterInfoBeanFromJson(json); diff --git a/lib/beans/character_info_bean.g.dart b/lib/beans/character_info_bean.g.dart index 33ea21f..1ac1c61 100644 --- a/lib/beans/character_info_bean.g.dart +++ b/lib/beans/character_info_bean.g.dart @@ -20,6 +20,7 @@ CharacterInfoBean _$CharacterInfoBeanFromJson(Map json) => (json['label'] as List?) ?.map((e) => LabelBean.fromJson(e as Map)) .toList(), + json['memoryCardState'] as bool?, ); Map _$CharacterInfoBeanToJson(CharacterInfoBean instance) => @@ -34,4 +35,5 @@ Map _$CharacterInfoBeanToJson(CharacterInfoBean instance) => 'biography': instance.biography, 'prologue': instance.prologue, 'label': instance.label?.map((e) => e.toJson()).toList(), + 'memoryCardState': instance.memoryCardState, }; diff --git a/lib/beans/mall_item_bean.dart b/lib/beans/mall_item_bean.dart index 78cf481..fc67130 100644 --- a/lib/beans/mall_item_bean.dart +++ b/lib/beans/mall_item_bean.dart @@ -6,14 +6,16 @@ part 'mall_item_bean.g.dart'; @JsonSerializable(explicitToJson: true) class MallItemBean { int? propId; - String? propName; + String? productId; + String? productDesc; + String? productName; int? propCount; int? propType; - int? price; + String? price; int? priceType; String? imgUrl; - MallItemBean(this.propId, this.propName, this.propCount, this.propType, this.price, this.priceType, this.imgUrl); + MallItemBean(this.propId, this.productId, this.productDesc, this.productName, this.propCount, this.propType, this.price, this.priceType, this.imgUrl); factory MallItemBean.fromJson(Map json) => _$MallItemBeanFromJson(json); diff --git a/lib/beans/mall_item_bean.g.dart b/lib/beans/mall_item_bean.g.dart index ac5a667..c77aab1 100644 --- a/lib/beans/mall_item_bean.g.dart +++ b/lib/beans/mall_item_bean.g.dart @@ -8,10 +8,12 @@ part of 'mall_item_bean.dart'; MallItemBean _$MallItemBeanFromJson(Map json) => MallItemBean( (json['propId'] as num?)?.toInt(), - json['propName'] as String?, + json['productId'] as String?, + json['productDesc'] as String?, + json['productName'] as String?, (json['propCount'] as num?)?.toInt(), (json['propType'] as num?)?.toInt(), - (json['price'] as num?)?.toInt(), + json['price'] as String?, (json['priceType'] as num?)?.toInt(), json['imgUrl'] as String?, ); @@ -19,7 +21,9 @@ MallItemBean _$MallItemBeanFromJson(Map json) => MallItemBean( Map _$MallItemBeanToJson(MallItemBean instance) => { 'propId': instance.propId, - 'propName': instance.propName, + 'productId': instance.productId, + 'productDesc': instance.productDesc, + 'productName': instance.productName, 'propCount': instance.propCount, 'propType': instance.propType, 'price': instance.price, diff --git a/lib/beans/memory_card_bean.dart b/lib/beans/memory_card_bean.dart new file mode 100644 index 0000000..7e1f705 --- /dev/null +++ b/lib/beans/memory_card_bean.dart @@ -0,0 +1,17 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'memory_card_bean.g.dart'; + +///标签 +@JsonSerializable(explicitToJson: true) +class MemoryCardBean { + int? propId; + String? propName; + String? imgUrl; + + MemoryCardBean(this.propId, this.propName, this.imgUrl); + + factory MemoryCardBean.fromJson(Map json) => _$MemoryCardBeanFromJson(json); + + Map toJson() => _$MemoryCardBeanToJson(this); +} diff --git a/lib/beans/memory_card_bean.g.dart b/lib/beans/memory_card_bean.g.dart new file mode 100644 index 0000000..3fccba4 --- /dev/null +++ b/lib/beans/memory_card_bean.g.dart @@ -0,0 +1,21 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'memory_card_bean.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +MemoryCardBean _$MemoryCardBeanFromJson(Map json) => + MemoryCardBean( + (json['propId'] as num?)?.toInt(), + json['propName'] as String?, + json['imgUrl'] as String?, + ); + +Map _$MemoryCardBeanToJson(MemoryCardBean instance) => + { + 'propId': instance.propId, + 'propName': instance.propName, + 'imgUrl': instance.imgUrl, + }; diff --git a/lib/common/EventBusUtil.dart b/lib/common/EventBusUtil.dart new file mode 100644 index 0000000..f7b8c7e --- /dev/null +++ b/lib/common/EventBusUtil.dart @@ -0,0 +1,42 @@ +import 'dart:async'; + +import 'package:event_bus/event_bus.dart'; + +class EventBusUtil { + static EventBus? _eventBus; + + //获取单例 + static EventBus getInstance() { + _eventBus ??= EventBus(); + return _eventBus!; + } + + //返回某事件的订阅者 + static StreamSubscription listen(Function(T event) onData) { + _eventBus ??= EventBus(); + //内部流属于广播模式,可以有多个订阅者 + return _eventBus!.on().listen(onData); + } + + //发送事件 + static void fire(T e) { + _eventBus ??= EventBus(); + _eventBus!.fire(e); + } +} + +abstract class Event {} + +class OrderStatusEvent extends Event {} + +class PushStatusEvent extends Event {} + +//刷新用户信息 +class RefreshUserdata extends Event { + RefreshUserdata(); +} + +//支付成功 +class PaySuccess extends Event { + PaySuccess(); +} diff --git a/lib/dialog/memory_card_dialog.dart b/lib/dialog/memory_card_dialog.dart index 680518c..2ac7937 100644 --- a/lib/dialog/memory_card_dialog.dart +++ b/lib/dialog/memory_card_dialog.dart @@ -1,17 +1,22 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; -import '../network/NetworkConfig.dart'; +import '../beans/memory_card_bean.dart'; class MemoryCardDialog extends StatefulWidget { Function onTap; - MemoryCardDialog({required this.onTap}); + List memoryCardList; + + MemoryCardDialog({required this.onTap, required this.memoryCardList}); @override State createState() => _MemoryCardDialogState(); } class _MemoryCardDialogState extends State { + int currentIndex = 0; + @override void initState() { // TODO: implement initState @@ -36,31 +41,29 @@ class _MemoryCardDialogState extends State { decoration: BoxDecoration(color: Color(0xFF272734), borderRadius: BorderRadius.all(Radius.circular(7))), ), Container( - margin: EdgeInsets.only(top: 38, left: 22, bottom: 19), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - decoration: BoxDecoration(color: Color(0xFF2A2A2A), borderRadius: BorderRadius.all(Radius.circular(7))), - child: Image( - width: 155, - height: 100, - image: AssetImage('assets/images/ic_memory_card.png'), - ), - ), - Container( - margin: EdgeInsets.only(left: 30), - child: Text( - "x ${NetworkConfig.userInfoBean?.memoryCardCount}", - style: TextStyle(color: Color(0xFFFF9000)), - ), - ) - ], - ), + height: 300, + margin: EdgeInsets.only(top: 38, left: 19, bottom: 10, right: 19), + child: GridView.count( + shrinkWrap: true, + //水平子Widget之间间距 + crossAxisSpacing: 12.0, + //垂直子Widget之间间距 + mainAxisSpacing: 14.0, + //GridView内边距 + padding: EdgeInsets.zero, + //一行的Widget数量 + crossAxisCount: 2, + //子Widget宽高比例 + childAspectRatio: 1.54, + //子Widget列表 + children: _item(), + //类似 cellForRow 函数 + scrollDirection: Axis.vertical), ), GestureDetector( onTap: () { - widget.onTap(); + Navigator.of(context).pop(); + widget.onTap(widget.memoryCardList[currentIndex].propId); }, child: Container( width: double.infinity, @@ -82,4 +85,32 @@ class _MemoryCardDialogState extends State { ), ); } + + _item() { + return widget.memoryCardList.map((res) { + int index = widget.memoryCardList.indexOf(res); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GestureDetector( + onTap: () { + currentIndex = index; + setState(() {}); + }, + child: Container( + decoration: BoxDecoration( + color: Color(0xFF2A2A2A), + border: Border.all(color: currentIndex == index ? Color(0xFFFF9000) : Color(0xFF2A2A2A), width: 1), + borderRadius: BorderRadius.all(Radius.circular(7))), + child: CachedNetworkImage( + fit: BoxFit.cover, + imageUrl: res.imgUrl!, + errorWidget: (context, url, error) => const Icon(Icons.error), + ), + ), + ), + ], + ); + }).toList(); + } } diff --git a/lib/dialog/prop_pay_dialog.dart b/lib/dialog/prop_pay_dialog.dart new file mode 100644 index 0000000..4b85709 --- /dev/null +++ b/lib/dialog/prop_pay_dialog.dart @@ -0,0 +1,173 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:talk/network/NetworkConfig.dart'; + +class PropPayDialog extends StatefulWidget { + Function onTap; + String priceImgUrl; + String productName; + String productDesc; + String price; + + PropPayDialog( + {super.key, required this.onTap, required this.priceImgUrl, required this.productName, required this.productDesc, required this.price}); + + @override + State createState() => _PropPayDialogState(); +} + +class _PropPayDialogState extends State { + @override + void initState() { + // TODO: implement initState + super.initState(); + } + + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + return Material( + type: MaterialType.transparency, //透明类型 + color: Color(0x1A000000), + child: Container( + decoration: const BoxDecoration( + color: Color(0xFF19191A), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(7), + topRight: Radius.circular(7), + )), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 25, + height: 3, + margin: EdgeInsets.only(top: 14), + decoration: BoxDecoration(color: Color(0xFF272734)), + ), + Container( + alignment: Alignment.centerLeft, + margin: EdgeInsets.only(top: 16, left: 16), + child: Text( + '购买道具', + style: TextStyle(fontSize: 16, color: Colors.white), + ), + ), + Container( + margin: EdgeInsets.only(top: 18, left: 16), + child: Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(7)), + child: Container( + color: Color(0xFF2A2A2A), + child: CachedNetworkImage( + width: 100, + height: 65, + fit: BoxFit.cover, + imageUrl: widget.priceImgUrl, + errorWidget: (context, url, error) => const Icon(Icons.error), + ), + ), + ), + Container( + width: 180, + margin: EdgeInsets.only(left: 22), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.productName, + style: TextStyle(fontSize: 16, color: Colors.white), + ), + Container( + margin: EdgeInsets.only(top: 11), + child: Text( + widget.productDesc, + style: TextStyle(fontSize: 12, color: Color(0xFF9E9E9E)), + ), + ) + ], + ), + ), + ], + ), + ), + Container( + height: 1, + margin: EdgeInsets.only(top: 23, left: 16, right: 16), + color: Color(0xFF484848), + ), + Container( + margin: EdgeInsets.only(top: 20, left: 16, right: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "账户余额${NetworkConfig.userInfoBean?.currency}语珠", + style: TextStyle(fontSize: 14, color: Color(0xFF9E9E9E)), + ), + Text( + "合计 ${widget.price}语珠", + style: TextStyle(fontSize: 14, color: Colors.white), + ), + ], + ), + ), + Container( + height: 1, + margin: EdgeInsets.only(top: 23, left: 16, right: 16), + color: Color(0xFF484848), + ), + Container( + margin: EdgeInsets.only(left: 16, right: 16, top: 25, bottom: 36), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.of(context).pop(); + }, + child: Container( + width: 159, + height: 40, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(0xFF555555), + borderRadius: BorderRadius.all(Radius.circular(10)), + ), + child: Text( + "取消", + style: TextStyle(fontSize: 16, color: Colors.white), + ), + ), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + widget.onTap(); + Navigator.of(context).pop(); + }, + child: Container( + width: 159, + height: 40, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(0xFFFF9000), + borderRadius: BorderRadius.all(Radius.circular(10)), + ), + child: Text( + "购买", + style: TextStyle(fontSize: 16, color: Colors.black), + ), + ), + ), + ], + ), + ), + ], + )), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index 299bc11..522f4cb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -21,6 +21,7 @@ import 'package:talk/tools/shop/problem_page.dart'; import 'package:talk/tools/shop/shop_page.dart'; import 'package:talk/tools/start_page.dart'; +import 'common/EventBusUtil.dart'; import 'common/Global.dart'; Future main() async { @@ -56,13 +57,17 @@ class _ChatAppState extends State { break; case "AlipaySuccess": //支付宝支付完成 - print("AlipaySuccess6666666666666"); - EasyLoading.showToast("支付成功"); + // EasyLoading.showToast("支付成功"); + EventBusUtil.fire(PaySuccess()); break; - case "wxPaySuccess": //支付宝支付完成 - print("wxPaySuccess6666666666666"); - EasyLoading.showToast("微信支付成功"); + case "wxPaySuccess": //微信支付完成 + // EasyLoading.showToast("微信支付成功"); + EventBusUtil.fire(PaySuccess()); + break; + + case "payError": //支付失败 + EasyLoading.showToast("支付失败"); break; } } diff --git a/lib/network/NetworkConfig.dart b/lib/network/NetworkConfig.dart index 5154dbe..9118db0 100644 --- a/lib/network/NetworkConfig.dart +++ b/lib/network/NetworkConfig.dart @@ -1,3 +1,4 @@ +import '../beans/memory_card_bean.dart'; import '../beans/user_info_bean.dart'; class NetworkConfig { @@ -30,6 +31,9 @@ class NetworkConfig { static UserInfoBean? userInfoBean; static bool isTeenage = false; //是否是青少年模式 static String teenagePassword = ""; //青少年模式密码 + static String orderId = ""; //订单号 + static String currencyNum = ""; //语珠数量 + static List memoryCardList = []; //语珠数量 static const String accountLogin = "api/Account/AccountLogIn"; //登录 static const String sendPhoneNumber = "api/Account/SendPhoneNumber"; //获取验证码 @@ -65,4 +69,12 @@ class NetworkConfig { static const String logout = "api/Account/Logout"; //注销账号 static const String createOrder = "api/Payment/CreateOrder"; //创建订单 + + static const String getOrderRewardsInfo = "api/Payment/GetOrderRewardsInfo"; //获取订单状态 + + static const String buyProduct = "api/Payment/BuyProduct"; //购买商城道具 + + static const String getMemoryCardInfo = "api/Chat/GetMemoryCardInfo"; //获取记忆卡列表 + + static const String useMemoryCard = "api/Chat/UseMemoryCard"; //使用道具卡 } diff --git a/lib/tools/chat/chat_model.dart b/lib/tools/chat/chat_model.dart index 90a19ba..3af1477 100644 --- a/lib/tools/chat/chat_model.dart +++ b/lib/tools/chat/chat_model.dart @@ -5,6 +5,7 @@ import 'package:talk/network/RequestCenter.dart'; import '../../beans/character_info_bean.dart'; import '../../beans/chat_info_bean.dart'; +import '../../beans/memory_card_bean.dart'; import '../../beans/send_message_bean.dart'; import '../../network/BaseEntity.dart'; @@ -20,7 +21,6 @@ class ChatModel { ///获取人物信息 Future getCharacterInfo(characterId) async { RequestCenter.instance.requestGet(NetworkConfig.getCharacterInfo, {"characterId": characterId}, (BaseEntity dataEntity) { - if (dataEntity.code == 0) { CharacterInfoBean characterInfoBean = CharacterInfoBean.fromJson(dataEntity.data); @@ -30,7 +30,7 @@ class ChatModel { }); } else { streamController.sink.add({ - 'code': "-1", //有数据 + 'code': "error", //有数据 'data': dataEntity.message }); } @@ -47,14 +47,13 @@ class ChatModel { if (dataEntity.code == 0) { List data = (dataEntity.data as List).map((e) => ChatInfoBean.fromJson(e as Map)).toList(); - streamController.sink.add({ 'code': "getChatInfo", //有数据 'data': data }); } else { streamController.sink.add({ - 'code': "-1", //有数据 + 'code': "error", //有数据 'data': dataEntity.message }); } @@ -104,7 +103,7 @@ class ChatModel { }); } else { streamController.sink.add({ - 'code': "-1", //有数据 + 'code': "error", //有数据 'data': dataEntity.message }); } @@ -127,7 +126,7 @@ class ChatModel { }); } else { streamController.sink.add({ - 'code': "-1", //有数据 + 'code': "error", //有数据 'data': dataEntity.message }); } @@ -135,4 +134,40 @@ class ChatModel { print("errorEntity==${errorEntity.message}"); }); } + + ///使用道具卡 + Future useMemoryCard(propId, characterId) async { + RequestCenter.instance.request(NetworkConfig.useMemoryCard, { + "propId": propId, + "characterId": characterId, + }, (BaseEntity dataEntity) { + if (dataEntity.code == 0) { + getMemoryCardInfo(); + streamController.sink.add({ + 'code': "useMemoryCard", //有数据 + 'data': dataEntity.message + }); + } else { + streamController.sink.add({ + 'code': "error", //有数据 + 'data': dataEntity.message + }); + } + }, (ErrorEntity errorEntity) { + print("errorEntity==${errorEntity.message}"); + }); + } + + ///获取记忆卡列表 + Future getMemoryCardInfo() async { + RequestCenter.instance.requestGet(NetworkConfig.getMemoryCardInfo, {}, (BaseEntity dataEntity) { + List data = (dataEntity.data as List).map((e) => MemoryCardBean.fromJson(e as Map)).toList(); + + if (dataEntity.code == 0) { + NetworkConfig.memoryCardList = data; + } + }, (ErrorEntity errorEntity) { + print("errorEntity==${errorEntity.message}"); + }); + } } diff --git a/lib/tools/chat/chat_page.dart b/lib/tools/chat/chat_page.dart index 9995294..967b959 100644 --- a/lib/tools/chat/chat_page.dart +++ b/lib/tools/chat/chat_page.dart @@ -7,6 +7,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import '../../beans/character_info_bean.dart'; import '../../beans/chat_info_bean.dart'; @@ -15,7 +16,9 @@ import '../../common/func.dart'; import '../../custom/DynamicText.dart'; import '../../custom/custom_popup.dart'; import '../../dialog/delete_dialog.dart'; +import '../../dialog/memory_card_dialog.dart'; import '../../dialog/restart_chat_dialog.dart'; +import '../../network/NetworkConfig.dart'; import 'chat_info_page.dart'; import 'chat_model.dart'; @@ -37,7 +40,7 @@ class _ChatPageState extends State { final FocusNode _focusNode = FocusNode(); ///人物信息 - CharacterInfoBean? characterInfoBean; + late CharacterInfoBean characterInfoBean; ///发送消息聊天 late SendMessageBean sendMessageBean; @@ -65,6 +68,8 @@ class _ChatPageState extends State { int delIndex = 0; + bool memoryCardState = false; + ///聊天列表滑动到底部 void _scrollToBottom() { Future.delayed(Duration(milliseconds: 300), () { @@ -87,6 +92,7 @@ class _ChatPageState extends State { switch (code) { case "getCharacterInfo": characterInfoBean = newData['data']; + memoryCardState = characterInfoBean.memoryCardState!; _viewmodel.getChatInfo(widget.characterId); break; case "getChatInfo": @@ -136,6 +142,18 @@ class _ChatPageState extends State { EasyLoading.dismiss(); break; + case "useMemoryCard": //使用道具卡 + memoryCardState = true; + Fluttertoast.showToast( + msg: newData['data'], + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + textColor: Colors.white, + backgroundColor: Colors.black.withOpacity(0.5), + ); + + break; + default: EasyLoading.dismiss(); EasyLoading.showToast(newData['data']); @@ -211,12 +229,12 @@ class _ChatPageState extends State { backgroundColor: Color(0xFF121213), body: Stack( children: [ - characterInfoBean != null && characterInfoBean?.bgUrl != null + characterInfoBean.bgUrl != null ? CachedNetworkImage( fit: BoxFit.cover, width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, - imageUrl: "${characterInfoBean?.bgUrl}", + imageUrl: "${characterInfoBean.bgUrl}", errorWidget: (context, url, error) => const Icon(Icons.error), ) : Container(), @@ -282,7 +300,7 @@ class _ChatPageState extends State { context, MaterialPageRoute( builder: (context) => ChatInfoPage( - data: characterInfoBean!, + data: characterInfoBean, )), ); }, @@ -292,7 +310,7 @@ class _ChatPageState extends State { child: CachedNetworkImage( width: 23, height: 23, - imageUrl: '${characterInfoBean?.icon}', + imageUrl: '${characterInfoBean.icon}', errorWidget: (context, url, error) => const Icon(Icons.error), ), ), @@ -309,7 +327,7 @@ class _ChatPageState extends State { SizedBox( width: h35, child: Text( - "${characterInfoBean?.characterName}", + "${characterInfoBean.characterName}", overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 11, color: Colors.white), ), @@ -317,7 +335,7 @@ class _ChatPageState extends State { SizedBox( width: h35, child: Text( - '${characterInfoBean?.lookCount} 聊过', + '${characterInfoBean.lookCount} 聊过', style: TextStyle(fontSize: 9, color: Color(0xFFBDBDBD)), ), ), @@ -325,6 +343,13 @@ class _ChatPageState extends State { ), ), + memoryCardState + ? Container( + margin: EdgeInsets.only(right: 5), + child: Image(width: 24, height: 24, image: AssetImage('assets/images/ic_memory.png')), + ) + : Container(), + ///心动值 // Container( // margin: EdgeInsets.only(left: 6, right: 6), @@ -588,6 +613,42 @@ class _ChatPageState extends State { ), ), + Container( + margin: EdgeInsets.only(left: l50), + child: GestureDetector( + onTap: () { + setState(() { + isMore = false; + }); + if (NetworkConfig.memoryCardList.isNotEmpty) { + FunctionUtil.bottomSheetDialog( + context, + MemoryCardDialog( + onTap: (propId) { + _viewmodel.useMemoryCard(propId, widget.characterId); + }, + memoryCardList: NetworkConfig.memoryCardList, + )); + } else { + Navigator.pushNamed(context, "/ShopPage"); + } + }, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Image(width: 26, height: 26, image: AssetImage('assets/images/ic_memory.png')), + Container( + margin: EdgeInsets.only(top: 9), + child: Text( + '记忆提升', + style: TextStyle(fontSize: 10, color: Color(0xFFA2A2A2)), + ), + ), + ], + ), + ), + ), + Container( margin: EdgeInsets.only(left: l50), child: GestureDetector( @@ -609,39 +670,6 @@ class _ChatPageState extends State { ), ), ), - - // Container( - // margin: EdgeInsets.only(left: l50), - // child: GestureDetector( - // onTap: () { - // setState(() { - // isMore = false; - // }); - // if (NetworkConfig.userInfoBean!.memoryCardCount! > 0) { - // FunctionUtil.bottomSheetDialog(context, MemoryCardDialog( - // onTap: () { - // EasyLoading.showToast("status"); - // }, - // )); - // } else { - // Navigator.pushNamed(context, "/ShopPage"); - // } - // }, - // child: Column( - // mainAxisSize: MainAxisSize.min, - // children: [ - // Image(width: 26, height: 26, image: AssetImage('assets/images/ic_memory.png')), - // Container( - // margin: EdgeInsets.only(top: 9), - // child: Text( - // '记忆提升', - // style: TextStyle(fontSize: 10, color: Color(0xFFA2A2A2)), - // ), - // ), - // ], - // ), - // ), - // ), ], ), ) diff --git a/lib/tools/find/recommend_page.dart b/lib/tools/find/recommend_page.dart index 9c454e0..22df894 100644 --- a/lib/tools/find/recommend_page.dart +++ b/lib/tools/find/recommend_page.dart @@ -94,8 +94,7 @@ class _RecommendPageState extends State with AutomaticKeepAliveCl final t21 = size.width / 17.14285714285714; final h330 = size.width / 1.090909090909091; final t34 = size.width / 10.58823529411765; - final b60 = size.width / 6; - final h153 = size.width / 2.352941176470588; + final h165 = size.width / 2.181818181818182; return Stack( children: [ @@ -178,8 +177,8 @@ class _RecommendPageState extends State with AutomaticKeepAliveCl ), ), Container( - height: h153 * (popularList.length), - margin: EdgeInsets.only(left: l16, right: l16, bottom: b60), + height: h165 * (popularList.length), + margin: EdgeInsets.only(left: l16, right: l16), child: ListView.builder( itemCount: popularList.length, physics: NeverScrollableScrollPhysics(), diff --git a/lib/tools/home/home_chat_page.dart b/lib/tools/home/home_chat_page.dart index c5d3b50..3c422db 100644 --- a/lib/tools/home/home_chat_page.dart +++ b/lib/tools/home/home_chat_page.dart @@ -7,6 +7,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import '../../beans/character_info_bean.dart'; import '../../beans/chat_info_bean.dart'; @@ -16,6 +17,7 @@ import '../../common/func.dart'; import '../../custom/DynamicText.dart'; import '../../custom/custom_popup.dart'; import '../../dialog/delete_dialog.dart'; +import '../../dialog/memory_card_dialog.dart'; import '../../dialog/restart_chat_dialog.dart'; import '../../network/NetworkConfig.dart'; import '../chat/chat_info_page.dart'; @@ -67,6 +69,8 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie int delIndex = 0; + bool memoryCardState = false; + @override void initState() { // TODO: implement initState @@ -78,6 +82,7 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie switch (code) { case "getCharacterInfo": characterInfoBean = newData['data']; + memoryCardState = characterInfoBean.memoryCardState!; _viewmodel.getChatInfo(widget.characterId); break; case "getChatInfo": @@ -128,8 +133,19 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie EasyLoading.dismiss(); break; + case "useMemoryCard": //使用道具卡 + memoryCardState = true; + Fluttertoast.showToast( + msg: newData['data'], + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + textColor: Colors.white, + backgroundColor: Colors.black.withOpacity(0.5), + ); + + break; + default: - EasyLoading.dismiss(); EasyLoading.showToast(newData['data']); break; } @@ -312,6 +328,13 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie ), ), + memoryCardState + ? Container( + margin: EdgeInsets.only(right: 5), + child: Image(width: 24, height: 24, image: AssetImage('assets/images/ic_memory.png')), + ) + : Container(), + ///心动值 // Container( // margin: EdgeInsets.only(left: 6, right: 6), @@ -524,7 +547,6 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie // "test": "test", // }; // invokeNativeMethod("test", map); - }, child: Container( margin: EdgeInsets.only(left: 14), @@ -592,7 +614,41 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie ), ), ), - + Container( + margin: EdgeInsets.only(left: l50), + child: GestureDetector( + onTap: () { + setState(() { + isMore = false; + }); + if (NetworkConfig.memoryCardList.isNotEmpty) { + FunctionUtil.bottomSheetDialog( + context, + MemoryCardDialog( + onTap: (propId) { + _viewmodel.useMemoryCard(propId, widget.characterId); + }, + memoryCardList: NetworkConfig.memoryCardList, + )); + } else { + Navigator.pushNamed(context, "/ShopPage"); + } + }, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Image(width: 26, height: 26, image: AssetImage('assets/images/ic_memory.png')), + Container( + margin: EdgeInsets.only(top: 9), + child: Text( + '记忆提升', + style: TextStyle(fontSize: 10, color: Color(0xFFA2A2A2)), + ), + ), + ], + ), + ), + ), Container( margin: EdgeInsets.only(left: l50), child: GestureDetector( @@ -614,41 +670,6 @@ class _HomeChatPageState extends State with AutomaticKeepAliveClie ), ), ), - - // Container( - // margin: EdgeInsets.only(left: l50), - // child: GestureDetector( - // onTap: () { - // setState(() { - // isMore = false; - // }); - // // EasyLoading.show(status: 'loading...'); - // // _viewmodel.delChat(widget.characterId); - // if (NetworkConfig.userInfoBean!.memoryCardCount! > 0) { - // FunctionUtil.bottomSheetDialog(context, MemoryCardDialog( - // onTap: () { - // EasyLoading.showToast("status"); - // }, - // )); - // } else { - // Navigator.pushNamed(context, "/ShopPage"); - // } - // }, - // child: Column( - // mainAxisSize: MainAxisSize.min, - // children: [ - // Image(width: 26, height: 26, image: AssetImage('assets/images/ic_memory.png')), - // Container( - // margin: EdgeInsets.only(top: 9), - // child: Text( - // '记忆提升', - // style: TextStyle(fontSize: 10, color: Color(0xFFA2A2A2)), - // ), - // ), - // ], - // ), - // ), - // ), ], ), ) diff --git a/lib/tools/home/home_model.dart b/lib/tools/home/home_model.dart index ab03d81..5855417 100644 --- a/lib/tools/home/home_model.dart +++ b/lib/tools/home/home_model.dart @@ -3,8 +3,8 @@ import 'dart:async'; import 'package:talk/network/NetworkConfig.dart'; import 'package:talk/network/RequestCenter.dart'; -import '../../beans/character_info_bean.dart'; import '../../beans/home_character_bean.dart'; +import '../../beans/memory_card_bean.dart'; import '../../network/BaseEntity.dart'; class HomeModel { @@ -27,7 +27,7 @@ class HomeModel { 'code': "getCharacterIdList", //有数据 'data': data }); - }else{ + } else { streamController.sink.add({ 'code': "-1", //有数据 'data': dataEntity.message @@ -38,4 +38,16 @@ class HomeModel { }); } + ///获取记忆卡列表 + Future getMemoryCardInfo() async { + RequestCenter.instance.requestGet(NetworkConfig.getMemoryCardInfo, {}, (BaseEntity dataEntity) { + List data = (dataEntity.data as List).map((e) => MemoryCardBean.fromJson(e as Map)).toList(); + + if (dataEntity.code == 0) { + NetworkConfig.memoryCardList = data; + } + }, (ErrorEntity errorEntity) { + print("errorEntity==${errorEntity.message}"); + }); + } } diff --git a/lib/tools/home/my_home_page.dart b/lib/tools/home/my_home_page.dart index 473cb24..7aa0845 100644 --- a/lib/tools/home/my_home_page.dart +++ b/lib/tools/home/my_home_page.dart @@ -46,7 +46,7 @@ class _MyHomePageState extends State with SingleTickerProviderStateM }); _viewmodel.getCharacterIdList(); - // _viewmodel.getCharacterInfo(1); + _viewmodel.getMemoryCardInfo(); } @override diff --git a/lib/tools/me/me_page.dart b/lib/tools/me/me_page.dart index b0d5ede..663919a 100644 --- a/lib/tools/me/me_page.dart +++ b/lib/tools/me/me_page.dart @@ -216,7 +216,7 @@ class _MePageState extends State { }, child: Container( height: t38, - decoration: BoxDecoration(color: Color(0xFF2A2A2A), borderRadius: BorderRadius.all(Radius.circular(13))), + decoration: BoxDecoration(color: Color(0xFF2A2A2A), borderRadius: BorderRadius.all(Radius.circular(7))), child: Row( children: [ Container( @@ -247,7 +247,7 @@ class _MePageState extends State { }, child: Container( height: t38, - decoration: const BoxDecoration(color: Color(0xFF2A2A2A), borderRadius: BorderRadius.all(Radius.circular(13))), + decoration: const BoxDecoration(color: Color(0xFF2A2A2A), borderRadius: BorderRadius.all(Radius.circular(7))), child: Row( children: [ Container( diff --git a/lib/tools/shop/account_page.dart b/lib/tools/shop/account_page.dart index 2dac512..83c3383 100644 --- a/lib/tools/shop/account_page.dart +++ b/lib/tools/shop/account_page.dart @@ -3,6 +3,8 @@ import 'dart:async'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:talk/common/EventBusUtil.dart'; import 'package:talk/tools/shop/shop_model.dart'; import 'package:talk/tools/shop/transaction_page.dart'; @@ -12,6 +14,7 @@ import '../../beans/transaction_records_bean.dart'; import '../../common/Global.dart'; import '../../common/func.dart'; import '../../dialog/payment_method_dialog.dart'; +import '../me/agreement_page.dart'; ///货币 class AccountPage extends StatefulWidget { @@ -28,17 +31,25 @@ class _AccountPageState extends State { late AccountBean accountBean; List recordList = []; + StreamSubscription? _paySuccess; + @override void initState() { // TODO: implement initState super.initState(); + //支付完成 + _paySuccess = EventBusUtil.listen((event) { + _viewmodel.getOrderRewardsInfo(); + }); + subscription = _viewmodel.streamController.stream.listen((newData) { String code = newData['code']; if (code.isNotEmpty) { switch (code) { case "getMyAccount": accountBean = newData['data']; + // EasyLoading.dismiss(); break; case "getTransactionRecords": recordList = newData['data']; @@ -60,12 +71,26 @@ class _AccountPageState extends State { "orderInfoZfb": createOrderBean.payment, }; invokeNativeMethod("Alipay", map); + break; + case "getOrderRewardsInfo": //获取订单状态 + loadData(); + EasyLoading.showToast(newData['data']); + break; + + default: + EasyLoading.dismiss(); + EasyLoading.showToast(newData['data']); break; } setState(() {}); } }); + // EasyLoading.show(status: 'loading...'); + loadData(); + } + + loadData() { _viewmodel.getMyAccount(); _viewmodel.getTransactionRecords(); } @@ -79,6 +104,11 @@ class _AccountPageState extends State { @override Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final w45 = size.width / 8; + final t39 = size.width / 9.230769230769231; + final h35 = size.width / 10.28571428571429; + return Scaffold( backgroundColor: Color(0xFF121213), appBar: AppBar( @@ -106,7 +136,7 @@ class _AccountPageState extends State { mainAxisSize: MainAxisSize.min, children: [ Image( - width: 45, + width: w45, image: AssetImage('assets/images/ic_pearl.png'), ), Container( @@ -119,7 +149,7 @@ class _AccountPageState extends State { ), Container( alignment: Alignment.centerLeft, - margin: EdgeInsets.only(top: 39), + margin: EdgeInsets.only(top: t39), child: Text( '账户充值', style: TextStyle(fontSize: 13, color: Color(0xFFACACAC)), @@ -147,7 +177,7 @@ class _AccountPageState extends State { ), Container( margin: EdgeInsets.only(top: 14), - decoration: BoxDecoration(color: Color(0xFF2A2A2A), borderRadius: BorderRadius.all(Radius.circular(17))), + decoration: BoxDecoration(color: Color(0xFF2A2A2A), borderRadius: BorderRadius.all(Radius.circular(7))), child: Column( children: [ GestureDetector( @@ -161,9 +191,9 @@ class _AccountPageState extends State { recordList: recordList, ))); }, - child: const SizedBox( - height: 35, - child: Stack( + child: SizedBox( + height: h35, + child: const Stack( alignment: Alignment.center, children: [ Positioned( @@ -192,11 +222,19 @@ class _AccountPageState extends State { GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { - Navigator.pushNamed(context, '/ProblemPage'); + // Navigator.pushNamed(context, '/ProblemPage'); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => AgreementPage( + title: "常见问题", + url: "https://shhuanmeng.com/shangcheng.html", + )), + ); }, child: SizedBox( - height: 35, - child: Stack( + height: h35, + child: const Stack( alignment: Alignment.center, children: [ Positioned( @@ -225,6 +263,34 @@ class _AccountPageState extends State { ], ), ), + Container( + margin: EdgeInsets.only(top: 22), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "充值代表已阅读并同意", + style: TextStyle(fontSize: 10, color: Color(0xFF686868)), + ), + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => AgreementPage( + title: "常见问题", + url: "https://shhuanmeng.com/shangcheng.html", + )), + ); + }, + child: Text( + "《充值协议》", + style: TextStyle(fontSize: 10, color: Color(0xFF969696)), + ), + ), + ], + ), + ), ], ), ), @@ -234,50 +300,23 @@ class _AccountPageState extends State { _item() { return accountBean.currencyRechargeList!.map((res) { - return Container( - height: 58, - decoration: BoxDecoration(color: Color(0xFF2A2A2A), borderRadius: BorderRadius.all(Radius.circular(17))), - child: Stack( - children: [ - GestureDetector( - onTap: () { - FunctionUtil.bottomSheetDialog(context, PaymentMethodDialog( - onTap: (isWX) { - _viewmodel.createOrder(res.productId.toString(), isWX ? "wx" : "zfb"); - }, - )); - }, - child: CachedNetworkImage( - // width: 155, - // height: 100, - fit: BoxFit.cover, - imageUrl: res.imgUrl!, - errorWidget: (context, url, error) => const Icon(Icons.error), - ), + return Stack( + children: [ + GestureDetector( + onTap: () { + FunctionUtil.bottomSheetDialog(context, PaymentMethodDialog( + onTap: (isWX) { + _viewmodel.createOrder(res.productId.toString(), isWX ? "wx" : "zfb"); + }, + )); + }, + child: CachedNetworkImage( + fit: BoxFit.cover, + imageUrl: res.imgUrl!, + errorWidget: (context, url, error) => const Icon(Icons.error), ), - // Positioned( - // left: 21, - // top: 14, - // child: Text( - // '${res.currencyCount}', - // style: TextStyle(color: Color(0xFFFF9000), fontSize: 13), - // )), - // Positioned( - // left: 48, - // top: 16, - // child: Text( - // '语珠', - // style: TextStyle(color: Color(0xFF6F6F6F), fontSize: 10), - // )), - // Positioned( - // left: 21, - // top: 34, - // child: Text( - // '${res.price}元', - // style: TextStyle(color: Colors.white, fontSize: 10), - // )), - ], - ), + ), + ], ); }).toList(); } diff --git a/lib/tools/shop/shop_model.dart b/lib/tools/shop/shop_model.dart index 21f26a4..93f1c36 100644 --- a/lib/tools/shop/shop_model.dart +++ b/lib/tools/shop/shop_model.dart @@ -6,7 +6,9 @@ import 'package:talk/network/RequestCenter.dart'; import '../../beans/account_bean.dart'; import '../../beans/create_order_bean.dart'; import '../../beans/mall_bean.dart'; +import '../../beans/memory_card_bean.dart'; import '../../beans/transaction_records_bean.dart'; +import '../../beans/user_info_bean.dart'; import '../../network/BaseEntity.dart'; class ShopModel { @@ -90,7 +92,7 @@ class ShopModel { }, (BaseEntity dataEntity) { if (dataEntity.code == 0) { CreateOrderBean createOrderBean = CreateOrderBean.fromJson(dataEntity.data); - + NetworkConfig.orderId = createOrderBean.orderId.toString(); print("dataEntity.data==${dataEntity.data}"); if (paymentMethod == "wx") { @@ -114,4 +116,77 @@ class ShopModel { print("errorEntity==${errorEntity.message}"); }); } + + ///查询订单 + Future getOrderRewardsInfo() async { + RequestCenter.instance.requestGet(NetworkConfig.getOrderRewardsInfo, { + "orderId": NetworkConfig.orderId, + }, (BaseEntity dataEntity) { + if (dataEntity.code == 0) { + print("dataEntity.data==${dataEntity.data}"); + getUserInfo(); + streamController.sink.add({ + 'code': "getOrderRewardsInfo", //有数据 + 'data': dataEntity.message, + }); + } else { + streamController.sink.add({ + 'code': "error", // + 'data': dataEntity.message, + }); + } + }, (ErrorEntity errorEntity) { + print("errorEntity==${errorEntity.message}"); + }); + } + + ///购买商城道具 + Future buyProduct(productId, buyCount) async { + RequestCenter.instance.request(NetworkConfig.buyProduct, { + "productId": productId, + "buyCount": buyCount, + }, (BaseEntity dataEntity) { + if (dataEntity.code == 0) { + print("dataEntity.data==${dataEntity.data}"); + getUserInfo(); + getMemoryCardInfo(); + streamController.sink.add({ + 'code': "buyProduct", //有数据 + 'data': dataEntity.message, + }); + } else { + streamController.sink.add({ + 'code': "error", // + 'data': dataEntity.message, + }); + } + }, (ErrorEntity errorEntity) { + print("errorEntity==${errorEntity.message}"); + }); + } + + ///获取记忆卡列表 + Future getMemoryCardInfo() async { + RequestCenter.instance.requestGet(NetworkConfig.getMemoryCardInfo, {}, (BaseEntity dataEntity) { + List data = (dataEntity.data as List).map((e) => MemoryCardBean.fromJson(e as Map)).toList(); + + if (dataEntity.code == 0) { + NetworkConfig.memoryCardList = data; + } + }, (ErrorEntity errorEntity) { + print("errorEntity==${errorEntity.message}"); + }); + } + + ///用户信息 + Future getUserInfo() async { + RequestCenter.instance.requestGet(NetworkConfig.getUserInfo, {}, (BaseEntity dataEntity) { + if (dataEntity.code == 0) { + UserInfoBean userInfoBean = UserInfoBean.fromJson(dataEntity.data); + NetworkConfig.userInfoBean = userInfoBean; + } + }, (ErrorEntity errorEntity) { + print("errorEntity==${errorEntity.message}"); + }); + } } diff --git a/lib/tools/shop/shop_page.dart b/lib/tools/shop/shop_page.dart index 8bb0344..9027c3f 100644 --- a/lib/tools/shop/shop_page.dart +++ b/lib/tools/shop/shop_page.dart @@ -2,10 +2,13 @@ import 'dart:async'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:talk/tools/shop/shop_model.dart'; import '../../beans/mall_bean.dart'; import '../../beans/mall_item_bean.dart'; +import '../../common/func.dart'; +import '../../dialog/prop_pay_dialog.dart'; ///货币商城 class ShopPage extends StatefulWidget { @@ -36,6 +39,14 @@ class _ShopPageState extends State { case "getMallItem": mallBean = newData['data']; break; + case "buyProduct": + EasyLoading.showToast(newData['data']); + _viewmodel.getMallItem(); + break; + default: + EasyLoading.dismiss(); + EasyLoading.showToast(newData['data']); + break; } setState(() {}); } @@ -146,9 +157,9 @@ class _ShopPageState extends State { //一行的Widget数量 crossAxisCount: 2, //子Widget宽高比例 - childAspectRatio: 1.0, + childAspectRatio: currentIndex == 0 ? 1.0 : 1.2, //子Widget列表 - children: _item(currentIndex == 0 ? mallBean.mall! : mallBean.purchased!), + children: currentIndex == 0 ? _item(mallBean.mall!) : _item2(mallBean.purchased!), physics: NeverScrollableScrollPhysics(), //类似 cellForRow 函数 scrollDirection: Axis.vertical), @@ -162,16 +173,88 @@ class _ShopPageState extends State { _item(List list) { return list.map((res) { + // 将字符串转换为double类型 + double priceDouble = double.parse(res.price.toString()); + // 取整 + int price = priceDouble.toInt(); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(15)), - child: CachedNetworkImage( - width: 155, - height: 100, - fit: BoxFit.cover, - imageUrl: res.imgUrl!, - errorWidget: (context, url, error) => const Icon(Icons.error), + GestureDetector( + onTap: () { + FunctionUtil.bottomSheetDialog( + context, + PropPayDialog( + onTap: () { + EasyLoading.show(status: "loading..."); + _viewmodel.buyProduct(res.productId, 0); + }, + price: price.toString(), + priceImgUrl: res.imgUrl.toString(), + productName: res.productName.toString(), + productDesc: res.productDesc.toString(), + )); + }, + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(7)), + child: Container( + color: Color(0xFF2A2A2A), + child: CachedNetworkImage( + width: 155, + height: 100, + fit: BoxFit.cover, + imageUrl: res.imgUrl!, + errorWidget: (context, url, error) => const Icon(Icons.error), + ), + ), + ), + ), + Container( + margin: EdgeInsets.only(top: 11), + child: Text( + "${res.productName}", + style: TextStyle(fontSize: 10, color: Colors.white), + ), + ), + Container( + margin: EdgeInsets.only(top: 11), + child: Text( + "$price 语珠", + style: TextStyle(fontSize: 9, color: Color(0xFFFF9000)), + ), + ), + ], + ); + }).toList(); + } + + _item2(List list) { + return list.map((res) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GestureDetector( + onTap: () {}, + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(7)), + child: Container( + color: Color(0xFF2A2A2A), + child: CachedNetworkImage( + width: 155, + height: 100, + fit: BoxFit.cover, + imageUrl: res.imgUrl!, + errorWidget: (context, url, error) => const Icon(Icons.error), + ), + ), + ), + ), + Container( + margin: EdgeInsets.only(top: 11), + child: Text( + "${res.productName}", + style: TextStyle(fontSize: 10, color: Colors.white), ), ), ], diff --git a/lib/tools/shop/transaction_page.dart b/lib/tools/shop/transaction_page.dart index 93c6e0d..2a8678a 100644 --- a/lib/tools/shop/transaction_page.dart +++ b/lib/tools/shop/transaction_page.dart @@ -51,9 +51,11 @@ class _TransactionPageState extends State { } _item(index,TransactionRecordsBean data) { + final size = MediaQuery.of(context).size; + final h70 = size.width / 5.142857142857143; return Container( width: double.infinity, - height: 70, + height: h70, child: Stack( alignment: Alignment.center, children: [ @@ -83,7 +85,7 @@ class _TransactionPageState extends State { Positioned( right: 0, child: Text( - '${data.transactionAmount}元', + '${data.transactionAmount}', style: TextStyle(fontSize: 11, color: Colors.white), )), ], diff --git a/pubspec.yaml b/pubspec.yaml index 1147f17..bb58fea 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -51,6 +51,8 @@ dependencies: webview_flutter: ^4.8.0 package_info_plus: ^8.0.0 flutter_verification_code: ^1.1.7 + event_bus: ^2.0.0 + fluttertoast: ^8.2.8 dev_dependencies: flutter_test: