diff --git a/lib/http/msg.dart b/lib/http/msg.dart index 5568e226..ebcb0895 100644 --- a/lib/http/msg.dart +++ b/lib/http/msg.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'dart:math'; +import 'package:flutter/material.dart'; import 'package:pilipala/models/msg/like.dart'; import 'package:pilipala/models/msg/reply.dart'; import 'package:pilipala/models/msg/system.dart'; @@ -63,7 +64,7 @@ class MsgHttp { .toList(), }; } catch (err) { - print('err🔟: $err'); + debugPrint('err: $err'); } } else { return { diff --git a/lib/models/msg/like.dart b/lib/models/msg/like.dart index b279131b..25d6f3de 100644 --- a/lib/models/msg/like.dart +++ b/lib/models/msg/like.dart @@ -39,7 +39,7 @@ class Total { List? items; factory Total.fromJson(Map json) => Total( - cursor: Cursor.fromJson(json['cursor']), + cursor: json['cursor'] != null ? Cursor.fromJson(json['cursor']) : null, items: json["items"] == null ? [] : json["items"].map((e) { diff --git a/lib/models/msg/session.dart b/lib/models/msg/session.dart index b6c1b6a6..7b1aee6b 100644 --- a/lib/models/msg/session.dart +++ b/lib/models/msg/session.dart @@ -13,8 +13,9 @@ class SessionDataModel { SessionDataModel.fromJson(Map json) { sessionList = json['session_list'] - ?.map((e) => SessionList.fromJson(e)) - .toList(); + ?.map((e) => SessionList.fromJson(e)) + .toList() ?? + []; hasMore = json['has_more']; } } diff --git a/lib/pages/home/view.dart b/lib/pages/home/view.dart index 2c32aa0d..97378eaf 100644 --- a/lib/pages/home/view.dart +++ b/lib/pages/home/view.dart @@ -395,14 +395,17 @@ class SearchBar extends StatelessWidget { color: colorScheme.onSecondaryContainer, ), const SizedBox(width: 10), - Obx( - () => Text( - ctr!.defaultSearch.value, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle(color: colorScheme.outline), + Expanded( + child: Obx( + () => Text( + ctr!.defaultSearch.value, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle(color: colorScheme.outline), + ), ), ), + const SizedBox(width: 10), ], ), ), diff --git a/lib/pages/member_article/controller.dart b/lib/pages/member_article/controller.dart index d79fb4a6..936dd9da 100644 --- a/lib/pages/member_article/controller.dart +++ b/lib/pages/member_article/controller.dart @@ -20,7 +20,7 @@ class MemberArticleController extends GetxController { } Future getMemberArticle(type) async { - if (isLoading.value) { + if (isLoading.value || !hasMore) { return; } isLoading.value = true; diff --git a/lib/pages/member_article/view.dart b/lib/pages/member_article/view.dart index 67cb8b96..bc7d4087 100644 --- a/lib/pages/member_article/view.dart +++ b/lib/pages/member_article/view.dart @@ -113,12 +113,14 @@ class _MemberArticlePageState extends State { 'articleType': 'opus', }); }, - leading: NetworkImgLayer( - width: 50, - height: 50, - type: 'emote', - src: item?.cover?['url'] ?? '', - ), + leading: item?.cover != null + ? NetworkImgLayer( + width: 50, + height: 50, + type: 'emote', + src: item?.cover?['url'] ?? '', + ) + : const SizedBox(), title: Text( item.content, maxLines: 2, diff --git a/lib/pages/message/like/view.dart b/lib/pages/message/like/view.dart index 6a7ba8a4..c29a7cc8 100644 --- a/lib/pages/message/like/view.dart +++ b/lib/pages/message/like/view.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; +import 'package:pilipala/common/widgets/no_data.dart'; import 'package:pilipala/models/msg/like.dart'; import 'package:pilipala/utils/utils.dart'; import '../utils/index.dart'; @@ -57,34 +58,34 @@ class _MessageLikePageState extends State { future: _futureBuilderFuture, builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.connectionState == ConnectionState.done) { - if (snapshot.data == null) { - return const SizedBox(); - } - if (snapshot.data['status']) { + Map? data = snapshot.data; + if (data != null && data['status']) { final likeItems = _messageLikeCtr.likeItems; return Obx( - () => ListView.separated( - controller: scrollController, - itemBuilder: (context, index) => LikeItem( - item: likeItems[index], - index: index, - messageLikeCtr: _messageLikeCtr, - ), - itemCount: likeItems.length, - separatorBuilder: (BuildContext context, int index) { - return Divider( - indent: 66, - endIndent: 14, - height: 1, - color: Colors.grey.withOpacity(0.1), - ); - }, - ), + () => likeItems.isEmpty + ? const CustomScrollView(slivers: [NoData()]) + : ListView.separated( + controller: scrollController, + itemBuilder: (context, index) => LikeItem( + item: likeItems[index], + index: index, + messageLikeCtr: _messageLikeCtr, + ), + itemCount: likeItems.length, + separatorBuilder: (BuildContext context, int index) { + return Divider( + indent: 66, + endIndent: 14, + height: 1, + color: Colors.grey.withOpacity(0.1), + ); + }, + ), ); } else { // 请求错误 return HttpError( - errMsg: snapshot.data['msg'], + errMsg: data?['msg'] ?? '请求异常', fn: () { setState(() { _futureBuilderFuture = _messageLikeCtr.queryMessageLike(); diff --git a/lib/pages/message/reply/view.dart b/lib/pages/message/reply/view.dart index 63a4de4a..325b494f 100644 --- a/lib/pages/message/reply/view.dart +++ b/lib/pages/message/reply/view.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; +import 'package:pilipala/common/widgets/no_data.dart'; import 'package:pilipala/models/msg/reply.dart'; import 'package:pilipala/pages/message/utils/index.dart'; import 'package:pilipala/utils/utils.dart'; @@ -58,31 +59,31 @@ class _MessageReplyPageState extends State { future: _futureBuilderFuture, builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.connectionState == ConnectionState.done) { - if (snapshot.data == null) { - return const SizedBox(); - } - if (snapshot.data['status']) { + Map? data = snapshot.data; + if (data != null && data['status']) { final replyItems = _messageReplyCtr.replyItems; return Obx( - () => ListView.separated( - controller: scrollController, - itemBuilder: (context, index) => - ReplyItem(item: replyItems[index]), - itemCount: replyItems.length, - separatorBuilder: (BuildContext context, int index) { - return Divider( - indent: 66, - endIndent: 14, - height: 1, - color: Colors.grey.withOpacity(0.1), - ); - }, - ), + () => replyItems.isEmpty + ? const CustomScrollView(slivers: [NoData()]) + : ListView.separated( + controller: scrollController, + itemBuilder: (context, index) => + ReplyItem(item: replyItems[index]), + itemCount: replyItems.length, + separatorBuilder: (BuildContext context, int index) { + return Divider( + indent: 66, + endIndent: 14, + height: 1, + color: Colors.grey.withOpacity(0.1), + ); + }, + ), ); } else { // 请求错误 return HttpError( - errMsg: snapshot.data['msg'], + errMsg: data?['msg'] ?? '请求异常', fn: () { setState(() { _futureBuilderFuture = diff --git a/lib/pages/subscription_detail/view.dart b/lib/pages/subscription_detail/view.dart index b41754d9..4bf93109 100644 --- a/lib/pages/subscription_detail/view.dart +++ b/lib/pages/subscription_detail/view.dart @@ -80,16 +80,21 @@ class _SubDetailPageState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - _subDetailController.item.title!, - style: Theme.of(context).textTheme.titleMedium, + SizedBox( + width: Get.size.width - 100, + child: Text( + _subDetailController.item.title!, + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: Theme.of(context).textTheme.titleMedium, + ), ), Text( '共${_subDetailController.item.mediaCount!}条视频', style: Theme.of(context).textTheme.labelMedium, ) ], - ) + ), ], ), ); diff --git a/lib/pages/whisper/controller.dart b/lib/pages/whisper/controller.dart index 749a3482..b4deb014 100644 --- a/lib/pages/whisper/controller.dart +++ b/lib/pages/whisper/controller.dart @@ -45,7 +45,9 @@ class WhisperController extends GetxController { if (isLoading) return; var res = await MsgHttp.sessionList( endTs: type == 'onLoad' ? sessionList.last.sessionTs : null); - if (res['data'].sessionList != null && res['data'].sessionList.isNotEmpty) { + if (res['status'] && + res['data'].sessionList != null && + res['data'].sessionList.isNotEmpty) { await queryAccountList(res['data'].sessionList); // 将 accountList 转换为 Map 结构 Map accountMap = {}; @@ -67,8 +69,6 @@ class WhisperController extends GetxController { ); } } - } - if (res['status'] && res['data'].sessionList != null) { if (type == 'onLoad') { sessionList.addAll(res['data'].sessionList); } else { @@ -81,10 +81,33 @@ class WhisperController extends GetxController { Future queryAccountList(sessionList) async { List midsList = sessionList.map((e) => e.talkerId!).toList(); + var index = midsList.indexOf(0); + AccountListModel? accountInfo; + if (index != -1) { + accountInfo = AccountListModel( + mid: 0, + name: '客服消息', + face: + 'https://i0.hdslb.com/bfs/activity-plat/static/20230809/f87fc7ea98282a4dd48ec7743044b0bf/OWdoP9ZXAX.png', + ); + } + if (midsList.length == 1 && index != -1) { + accountList.add(accountInfo!); + return; + } + var res = await MsgHttp.accountList(midsList.join(',')); if (res['status']) { accountList.value = res['data']; + if (accountInfo != null) { + if (accountList.isNotEmpty) { + accountList.insert(index, accountInfo); + } else { + accountList.add(accountInfo); + } + } } + return res; } diff --git a/lib/pages/whisper/view.dart b/lib/pages/whisper/view.dart index 8e61bab3..4780b908 100644 --- a/lib/pages/whisper/view.dart +++ b/lib/pages/whisper/view.dart @@ -4,7 +4,9 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/skeleton/skeleton.dart'; +import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; +import 'package:pilipala/common/widgets/no_data.dart'; import 'package:pilipala/utils/utils.dart'; import 'controller.dart'; @@ -126,7 +128,7 @@ class _WhisperPageState extends State { RxList sessionList = _whisperController.sessionList; return Obx( () => sessionList.isEmpty - ? const SizedBox() + ? const CustomScrollView(slivers: [NoData()]) : ListView.separated( itemCount: sessionList.length, shrinkWrap: true, @@ -150,8 +152,15 @@ class _WhisperPageState extends State { ); } else { // 请求错误 - return Center( - child: Text(data?['msg'] ?? '请求异常'), + return HttpError( + errMsg: data?['msg'] ?? '请求异常', + fn: () { + setState(() { + _futureBuilderFuture = + _whisperController.querySessionList('init'); + }); + }, + isInSliver: false, ); } } else {