diff --git a/lib/models/dynamics/result.dart b/lib/models/dynamics/result.dart index 5c2d929d5..d3e3ea66a 100644 --- a/lib/models/dynamics/result.dart +++ b/lib/models/dynamics/result.dart @@ -1220,6 +1220,7 @@ class RichTextNodeItem { String? type; String? rid; List? pics; + List? dynPic; String? jumpUrl; RichTextNodeItem.fromJson(Map json) { diff --git a/lib/pages/dynamics/widgets/rich_node_panel.dart b/lib/pages/dynamics/widgets/rich_node_panel.dart index 3f38813fb..6d0a29b22 100644 --- a/lib/pages/dynamics/widgets/rich_node_panel.dart +++ b/lib/pages/dynamics/widgets/rich_node_panel.dart @@ -281,12 +281,18 @@ TextSpan? richNode( onView(i.pics!); return; } + if (i.dynPic?.isNotEmpty == true) { + onView(i.dynPic!); + return; + } DynamicsHttp.dynPic(i.rid).then((res) { if (res.isSuccess) { var list = res.data; if (Platform.isAndroid) { i.pics = list; + } else { + i.dynPic = list; } if (list?.isNotEmpty == true) { onView(list!); diff --git a/lib/pages/dynamics/widgets/vote.dart b/lib/pages/dynamics/widgets/vote.dart index 9db480f22..002c1d8a2 100644 --- a/lib/pages/dynamics/widgets/vote.dart +++ b/lib/pages/dynamics/widgets/vote.dart @@ -7,6 +7,7 @@ import 'package:PiliPlus/models/dynamics/vote_model.dart'; import 'package:PiliPlus/utils/date_util.dart'; import 'package:PiliPlus/utils/num_util.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; class VotePanel extends StatefulWidget { final VoteInfo voteInfo; @@ -26,7 +27,7 @@ class _VotePanelState extends State { bool anonymity = false; late VoteInfo _voteInfo; - late final groupValue = _voteInfo.myVotes?.toSet() ?? {}; + late final RxSet groupValue = (_voteInfo.myVotes?.toSet() ?? {}).obs; late var _percentage = _cnt2Percentage(_voteInfo.options); late bool _enabled = groupValue.isEmpty && _voteInfo.endTime! * 1000 > DateTime.now().millisecondsSinceEpoch; @@ -83,7 +84,7 @@ class _VotePanelState extends State { ? '已结束' : '已完成', ), - if (_enabled) Text('${groupValue.length} / $_maxCnt'), + if (_enabled) Obx(() => Text('${groupValue.length} / $_maxCnt')) ], ), Flexible(fit: FlexFit.loose, child: _buildContext()), diff --git a/lib/pages/home/view.dart b/lib/pages/home/view.dart index c4e7725be..873d645d2 100644 --- a/lib/pages/home/view.dart +++ b/lib/pages/home/view.dart @@ -52,10 +52,9 @@ class _HomePageState extends State isScrollable: true, dividerColor: Colors.transparent, dividerHeight: 0, - enableFeedback: true, splashBorderRadius: StyleString.mdRadius, tabAlignment: TabAlignment.center, - onTap: (value) { + onTap: (_) { feedBack(); if (!_homeController.tabController.indexIsChanging) { _homeController.animateToTop(); diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index a36252758..b9946200e 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -51,6 +51,8 @@ class LiveRoomController extends GetxController { AccountService accountService = Get.find(); + LiveDmInfoData? dmInfo; + @override void onInit() { super.onInit(); @@ -163,7 +165,8 @@ class LiveRoomController extends GetxController { } LiveMessageStream? msgStream; - final ScrollController scrollController = ScrollController(); + late final ScrollController scrollController = ScrollController() + ..addListener(listener); void scrollToBottom() { if (disableAutoScroll.value) return; @@ -199,53 +202,17 @@ class LiveRoomController extends GetxController { } }); } + if (msgStream != null) { + return; + } + if (dmInfo != null) { + initDm(dmInfo!); + return; + } LiveHttp.liveRoomGetDanmakuToken(roomId: roomId).then((res) { if (res['status']) { - LiveDmInfoData info = res['data']; - // logger.d("info => $info"); - if (info.hostList!.isNullOrEmpty) { - return; - } - msgStream = LiveMessageStream( - streamToken: info.token!, - roomId: roomId, - uid: Accounts.main.mid, - servers: info.hostList! - .map((host) => 'wss://${host.host}:${host.wssPort}/sub') - .toList(), - ); - msgStream?.addEventListener((obj) { - if (obj['cmd'] == 'DANMU_MSG') { - // logger.i(' 原始弹幕消息 ======> ${jsonEncode(obj)}'); - final info = obj['info']; - final first = info[0]; - final content = first[15]; - final extra = jsonDecode(content['extra']); - final user = content['user']; - final uid = user['uid']; - messages.add({ - 'name': user['base']['name'], - 'uid': uid, - 'text': info[1], - 'emots': extra['emots'], - 'uemote': first[13], - }); - if (showDanmaku) { - controller?.addDanmaku( - DanmakuContentItem( - extra['content'], - color: DmUtils.decimalToColor(extra['color']), - type: DmUtils.getPosition(extra['mode']), - selfSend: uid == accountService.mid, - ), - ); - WidgetsBinding.instance - .addPostFrameCallback((_) => scrollToBottom()); - } - } - }); - msgStream?.init(); - scrollController.addListener(listener); + dmInfo = res['data']; + initDm(dmInfo!); } }); } @@ -282,4 +249,49 @@ class LiveRoomController extends GetxController { .description; return queryLiveInfo(); } + + void initDm(LiveDmInfoData info) { + if (info.hostList!.isNullOrEmpty) { + return; + } + msgStream = LiveMessageStream( + streamToken: info.token!, + roomId: roomId, + uid: Accounts.main.mid, + servers: info.hostList! + .map((host) => 'wss://${host.host}:${host.wssPort}/sub') + .toList(), + ) + ..addEventListener((obj) { + if (obj['cmd'] == 'DANMU_MSG') { + // logger.i(' 原始弹幕消息 ======> ${jsonEncode(obj)}'); + final info = obj['info']; + final first = info[0]; + final content = first[15]; + final extra = jsonDecode(content['extra']); + final user = content['user']; + final uid = user['uid']; + messages.add({ + 'name': user['base']['name'], + 'uid': uid, + 'text': info[1], + 'emots': extra['emots'], + 'uemote': first[13], + }); + if (showDanmaku) { + controller?.addDanmaku( + DanmakuContentItem( + extra['content'], + color: DmUtils.decimalToColor(extra['color']), + type: DmUtils.getPosition(extra['mode']), + selfSend: uid == accountService.mid, + ), + ); + WidgetsBinding.instance + .addPostFrameCallback((_) => scrollToBottom()); + } + } + }) + ..init(); + } } diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index 8e2b9df89..c25d53f9f 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -84,7 +84,9 @@ class _LiveRoomPageState extends State void playerListener(PlayerStatus? status) { if (status != PlayerStatus.playing) { plPlayerController.danmakuController?.pause(); - _liveRoomController.msgStream?.close(); + _liveRoomController + ..msgStream?.close() + ..msgStream = null; } else { plPlayerController.danmakuController?.resume(); _liveRoomController.liveMsg(); @@ -122,7 +124,9 @@ class _LiveRoomPageState extends State WidgetsBinding.instance.removeObserver(this); ScreenBrightness().resetApplicationScreenBrightness(); PlPlayerController.setPlayCallBack(null); - _liveRoomController.msgStream?.close(); + _liveRoomController + ..msgStream?.close() + ..msgStream = null; plPlayerController ..removeStatusLister(playerListener) ..dispose(); diff --git a/lib/pages/login/controller.dart b/lib/pages/login/controller.dart index 6f803d245..2c229de1a 100644 --- a/lib/pages/login/controller.dart +++ b/lib/pages/login/controller.dart @@ -35,8 +35,10 @@ class LoginPageController extends GetxController RxInt qrCodeLeftTime = 180.obs; RxString statusQRCode = ''.obs; - Map selectedCountryCodeId = - Constants.internationalDialingPrefix.first; + late final List> internationalDialingPrefix = + Constants.internationalDialingPrefix; + late Map selectedCountryCodeId = + internationalDialingPrefix.first; String captchaKey = ''; RxInt smsSendCooldown = 0.obs; int smsSendTimestamp = 0; diff --git a/lib/pages/login/view.dart b/lib/pages/login/view.dart index 288ed9fd8..c48fbf2e1 100644 --- a/lib/pages/login/view.dart +++ b/lib/pages/login/view.dart @@ -1,6 +1,5 @@ import 'dart:ui'; -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/pages/login/controller.dart'; import 'package:PiliPlus/utils/image_util.dart'; @@ -332,9 +331,6 @@ class _LoginPageState extends State { ); } - late final List> internationalDialingPrefix = - Constants.internationalDialingPrefix; - Widget loginBySmS(ThemeData theme) { return Column( children: [ @@ -360,7 +356,9 @@ class _LoginPageState extends State { '当前为${_loginPageCtr.selectedCountryCodeId['cname']},' '+${_loginPageCtr.selectedCountryCodeId['country_id']}', onSelected: (Map type) {}, - itemBuilder: (_) => internationalDialingPrefix + initialValue: _loginPageCtr.selectedCountryCodeId, + itemBuilder: (_) => _loginPageCtr + .internationalDialingPrefix .map((Map item) { return PopupMenuItem>( onTap: () { diff --git a/lib/pages/setting/widgets/model.dart b/lib/pages/setting/widgets/model.dart index 4022bf996..a7cb2fd2a 100644 --- a/lib/pages/setting/widgets/model.dart +++ b/lib/pages/setting/widgets/model.dart @@ -107,7 +107,6 @@ class SettingsModel { final Function? onTap; final EdgeInsetsGeometry? contentPadding; final TextStyle? titleStyle; - final bool? enableFeedback; SettingsModel({ required this.settingsType, @@ -124,7 +123,6 @@ class SettingsModel { this.onTap, this.contentPadding, this.titleStyle, - this.enableFeedback, }); } @@ -2210,7 +2208,6 @@ List get extraSettings => [ ), SettingsModel( settingsType: SettingsType.sw1tch, - enableFeedback: true, setKey: SettingBoxKey.feedBackEnable, onChanged: (value) { enableFeedback = value; diff --git a/lib/pages/setting/widgets/switch_item.dart b/lib/pages/setting/widgets/switch_item.dart index 5838f59d2..c60f3a9ed 100644 --- a/lib/pages/setting/widgets/switch_item.dart +++ b/lib/pages/setting/widgets/switch_item.dart @@ -122,7 +122,6 @@ class _SetSwitchItemState extends State { return ListTile( contentPadding: widget.contentPadding, enabled: widget.onTap != null ? val : true, - enableFeedback: true, onTap: () => widget.onTap != null ? widget.onTap?.call() : switchChange(theme, null), diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index 09229a761..eee93a406 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -21,8 +21,8 @@ import 'package:PiliPlus/pages/video/introduction/ugc/widgets/menu_row.dart'; import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart'; -import 'package:PiliPlus/utils/image_util.dart'; import 'package:PiliPlus/utils/extension.dart'; +import 'package:PiliPlus/utils/image_util.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -398,9 +398,8 @@ class HeaderControlState extends State { builder: (context) { return AlertDialog( title: const Text('播放信息'), - content: SizedBox( - width: double.infinity, - child: ListView( + content: SingleChildScrollView( + child: Column( children: [ ListTile( dense: true,