From 8708b90124b1978053ed06215846b8cfcc4fdd15 Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Tue, 25 Nov 2025 00:54:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(discover):=20=E5=AE=9E=E7=8E=B0=E7=9B=B8?= =?UTF-8?q?=E4=BA=B2=E9=A1=B5=E9=9D=A2=E4=B8=8B=E6=8B=89=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除废弃的图片资源引用 - 新增等待状态图片资源 - 集成 easy_refresh 库实现下拉刷新 - 使用 GridView 替代 Wrap 布局优化列表展示 - 添加刷新控制器管理刷新状态 - 优化直播间等待占位符样式 - 移除无用的全局控制器导入 --- assets/images/waitting.png | Bin 0 -> 7805 bytes lib/generated/assets.dart | 2 +- lib/pages/discover/dating_page.dart | 52 +++++++++++++++--- lib/pages/discover/party_page.dart | 1 + .../live/live_room_anchor_showcase.dart | 7 +-- 5 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 assets/images/waitting.png diff --git a/assets/images/waitting.png b/assets/images/waitting.png new file mode 100644 index 0000000000000000000000000000000000000000..ac34914dc2d89a64067ba187ed34e4dcf1c7cd57 GIT binary patch literal 7805 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 late final DiscoverController discoverController; late final TabController _tabController; late final RoomController roomController; + late final EasyRefreshController _refreshController; + @override void initState() { super.initState(); @@ -35,12 +38,17 @@ class _DatingPageState extends State roomController = Get.put(RoomController()); } _tabController = TabController(length: 4, vsync: this); + _refreshController = EasyRefreshController( + controlFinishRefresh: true, + controlFinishLoad: true, + ); discoverController.loadRtcChannelPage(); } @override void dispose() { _tabController.dispose(); + _refreshController.dispose(); super.dispose(); } @@ -114,20 +122,48 @@ class _DatingPageState extends State ), ); } - return SingleChildScrollView( - padding: EdgeInsets.symmetric(vertical: 5.w), - child: Wrap( - spacing: 7.w, - runSpacing: 7.w, - children: discoverController.rtcChannelList.map((channel) { + return EasyRefresh( + controller: _refreshController, + header: const ClassicHeader( + dragText: '下拉刷新', + armedText: '释放刷新', + readyText: '刷新中...', + processingText: '刷新中...', + processedText: '刷新完成', + failedText: '刷新失败', + noMoreText: '没有更多数据', + showMessage: false, + ), + onRefresh: () async { + print('相亲页面下拉刷新被触发'); + try { + await discoverController.refreshRtcChannelPage(); + _refreshController.finishRefresh(IndicatorResult.success); + print('相亲页面刷新完成'); + } catch (e) { + print('相亲页面刷新失败: $e'); + _refreshController.finishRefresh(IndicatorResult.fail); + } + }, + child: GridView.builder( + padding: EdgeInsets.symmetric(vertical: 5.w, horizontal: 0), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, // 每行2个 + crossAxisSpacing: 7.w, // 左右间距 + mainAxisSpacing: 7.w, // 上下间距 + childAspectRatio: 1, // 宽高比 + ), + itemCount: discoverController.rtcChannelList.length, + itemBuilder: (context, index) { + final channel = discoverController.rtcChannelList[index]; print('渲染频道: ${channel.channelId}, ${channel.channelName}'); return LiveItemWidget( channel: channel, channelId: channel.channelId, - ).onTap(() async{ + ).onTap(() async { await roomController.joinChannel(channel.channelId); }); - }).toList(), + }, ), ); }), diff --git a/lib/pages/discover/party_page.dart b/lib/pages/discover/party_page.dart index a5975a0..5438949 100644 --- a/lib/pages/discover/party_page.dart +++ b/lib/pages/discover/party_page.dart @@ -1,5 +1,6 @@ import 'package:dating_touchme_app/controller/discover/discover_controller.dart'; import 'package:dating_touchme_app/pages/discover/live_item_widget.dart'; +import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; diff --git a/lib/widget/live/live_room_anchor_showcase.dart b/lib/widget/live/live_room_anchor_showcase.dart index eda01bf..6b4dbef 100644 --- a/lib/widget/live/live_room_anchor_showcase.dart +++ b/lib/widget/live/live_room_anchor_showcase.dart @@ -1,6 +1,5 @@ import 'package:agora_rtc_engine/agora_rtc_engine.dart'; import 'package:dating_touchme_app/controller/discover/room_controller.dart'; -import 'package:dating_touchme_app/controller/global.dart'; import 'package:dating_touchme_app/generated/assets.dart'; import 'package:dating_touchme_app/model/rtc/rtc_channel_detail.dart'; import 'package:dating_touchme_app/rtc/rtc_manager.dart'; @@ -131,8 +130,7 @@ class _LiveRoomAnchorShowcaseState extends State { if (_roomController.rtcChannelDetail.value?.anchorInfo == null || engine == null) { return _buildWaitingPlaceholder(); } - print('joined: $joined'); - ClientRoleType role = _rtcManager.clientRole; + Get.log("buildAnchorVideo"); return ClipRRect( borderRadius: BorderRadius.all(Radius.circular(9.w)), child: SizedBox( @@ -161,12 +159,13 @@ class _LiveRoomAnchorShowcaseState extends State { } Widget _buildWaitingPlaceholder() { + Get.log("buildWaitingPlaceholder"); return Container( width: 177.w, height: 175.w, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(9.w)), - color: const Color.fromRGBO(47, 10, 94, 1), + color: Colors.grey.withOpacity(0.5), ), child: Center( child: Text(