diff --git a/lib/common/widgets/image/network_img_layer.dart b/lib/common/widgets/image/network_img_layer.dart index 4c9dbb0d..98a0582b 100644 --- a/lib/common/widgets/image/network_img_layer.dart +++ b/lib/common/widgets/image/network_img_layer.dart @@ -96,18 +96,16 @@ class NetworkImgLayer extends StatelessWidget { ? BorderRadius.circular(radius!) : StyleString.mdRadius, ), - child: type == 'bg' - ? const SizedBox.shrink() - : Center( - child: Image.asset( - type == ImageType.avatar - ? 'assets/images/noface.jpeg' - : 'assets/images/loading.png', - width: width, - height: height, - cacheWidth: width.cacheSize(context), - ), - ), + child: Center( + child: Image.asset( + type == ImageType.avatar + ? 'assets/images/noface.jpeg' + : 'assets/images/loading.png', + width: width, + height: height, + cacheWidth: width.cacheSize(context), + ), + ), ); } } diff --git a/lib/models/common/video/audio_quality.dart b/lib/models/common/video/audio_quality.dart index 43b733cb..3bf5d564 100644 --- a/lib/models/common/video/audio_quality.dart +++ b/lib/models/common/video/audio_quality.dart @@ -1,30 +1,16 @@ -// ignore_for_file: constant_identifier_names +enum AudioQuality { + k64(30216, '64K'), + k132(30232, '132K'), + k192(30280, '192K'), + dolby(30250, '杜比全景声'), + hiRes(30251, 'Hi-Res无损'); -enum AudioQuality { k64, k132, k192, dolby, hiRes } + final int code; + final String description; -extension AudioQualityExt on AudioQuality { - static const List _codeList = [ - 30216, - 30232, - 30280, - 30250, - 30251, - ]; - int get code => _codeList[index]; + const AudioQuality(this.code, this.description); - static AudioQuality? fromCode(int code) { - final index = _codeList.indexOf(code); - if (index != -1) { - return AudioQuality.values[index]; - } - return null; - } + static final _codeMap = {for (var i in values) i.code: i}; - String get description => const [ - '64K', - '132K', - '192K', - '杜比全景声', - 'Hi-Res无损', - ][index]; + static AudioQuality fromCode(int code) => _codeMap[code]!; } diff --git a/lib/models/common/video/video_quality.dart b/lib/models/common/video/video_quality.dart index 1358d90b..e5883a75 100644 --- a/lib/models/common/video/video_quality.dart +++ b/lib/models/common/video/video_quality.dart @@ -1,55 +1,23 @@ enum VideoQuality { - speed240, - fluent360, - clear480, - high720, - high72060, - high1080, - high1080plus, - high108060, - super4K, - hdr, - dolbyVision, - super8k -} - -extension VideoQualityExt on VideoQuality { - static const List _codeList = [ - 6, - 16, - 32, - 64, - 74, - 80, - 112, - 116, - 120, - 125, - 126, - 127, - ]; - int get code => _codeList[index]; - - static VideoQuality? fromCode(int code) { - final index = _codeList.indexOf(code); - if (index != -1) { - return VideoQuality.values[index]; - } - return null; - } - - String get description => const [ - '240P 极速', - '360P 流畅', - '480P 清晰', - '720P 高清', - '720P60 高帧率', - '1080P 高清', - '1080P+ 高码率', - '1080P60 高帧率', - '4K 超清', - 'HDR 真彩色', - '杜比视界', - '8K 超高清' - ][index]; + speed240(6, '240P 极速'), + fluent360(16, '360P 流畅'), + clear480(32, '480P 清晰'), + high720(64, '720P 高清'), + high72060(74, '720P60 高帧率'), + high1080(80, '1080P 高清'), + high1080plus(112, '1080P+ 高码率'), + high108060(116, '1080P60 高帧率'), + super4K(120, '4K 超清'), + hdr(125, 'HDR 真彩色'), + dolbyVision(126, '杜比视界'), + super8k(127, '8K 超高清'); + + final int code; + final String description; + + const VideoQuality(this.code, this.description); + + static final _codeMap = {for (var i in values) i.code: i}; + + static VideoQuality fromCode(int code) => _codeMap[code]!; } diff --git a/lib/models/dynamics/article_list/article.dart b/lib/models/dynamics/article_list/article.dart deleted file mode 100644 index 1771b814..00000000 --- a/lib/models/dynamics/article_list/article.dart +++ /dev/null @@ -1,84 +0,0 @@ -import 'package:PiliPlus/models/dynamics/article_list/category.dart'; -import 'package:PiliPlus/models/dynamics/article_list/stats.dart'; - -class Article { - int? id; - String? title; - int? state; - int? publishTime; - int? words; - List? imageUrls; - Category? category; - List? categories; - String? summary; - int? type; - String? dynIdStr; - int? attributes; - int? authorUid; - int? onlyFans; - Stats? stats; - int? likeState; - - Article({ - this.id, - this.title, - this.state, - this.publishTime, - this.words, - this.imageUrls, - this.category, - this.categories, - this.summary, - this.type, - this.dynIdStr, - this.attributes, - this.authorUid, - this.onlyFans, - this.stats, - this.likeState, - }); - - factory Article.fromJson(Map json) => Article( - id: json['id'] as int?, - title: json['title'] as String?, - state: json['state'] as int?, - publishTime: json['publish_time'] as int?, - words: json['words'] as int?, - imageUrls: json['image_urls'], - category: json['category'] == null - ? null - : Category.fromJson(json['category'] as Map), - categories: (json['categories'] as List?) - ?.map((e) => Category.fromJson(e as Map)) - .toList(), - summary: json['summary'] as String?, - type: json['type'] as int?, - dynIdStr: json['dyn_id_str'] as String?, - attributes: json['attributes'] as int?, - authorUid: json['author_uid'] as int?, - onlyFans: json['only_fans'] as int?, - stats: json['stats'] == null - ? null - : Stats.fromJson(json['stats'] as Map), - likeState: json['like_state'] as int?, - ); - - Map toJson() => { - 'id': id, - 'title': title, - 'state': state, - 'publish_time': publishTime, - 'words': words, - 'image_urls': imageUrls, - 'category': category?.toJson(), - 'categories': categories?.map((e) => e.toJson()).toList(), - 'summary': summary, - 'type': type, - 'dyn_id_str': dynIdStr, - 'attributes': attributes, - 'author_uid': authorUid, - 'only_fans': onlyFans, - 'stats': stats?.toJson(), - 'like_state': likeState, - }; -} diff --git a/lib/models/dynamics/article_list/author.dart b/lib/models/dynamics/article_list/author.dart deleted file mode 100644 index 2808a0de..00000000 --- a/lib/models/dynamics/article_list/author.dart +++ /dev/null @@ -1,23 +0,0 @@ -class Author { - int? mid; - String? name; - String? face; - - Author({ - this.mid, - this.name, - this.face, - }); - - factory Author.fromJson(Map json) => Author( - mid: json['mid'] as int?, - name: json['name'] as String?, - face: json['face'] as String?, - ); - - Map toJson() => { - 'mid': mid, - 'name': name, - 'face': face, - }; -} diff --git a/lib/models/dynamics/article_list/category.dart b/lib/models/dynamics/article_list/category.dart deleted file mode 100644 index ea85d9c4..00000000 --- a/lib/models/dynamics/article_list/category.dart +++ /dev/null @@ -1,19 +0,0 @@ -class Category { - int? id; - int? parentId; - String? name; - - Category({this.id, this.parentId, this.name}); - - factory Category.fromJson(Map json) => Category( - id: json['id'] as int?, - parentId: json['parent_id'] as int?, - name: json['name'] as String?, - ); - - Map toJson() => { - 'id': id, - 'parent_id': parentId, - 'name': name, - }; -} diff --git a/lib/models/dynamics/article_list/data.dart b/lib/models/dynamics/article_list/data.dart index 19a03c40..f3ae7e6c 100644 --- a/lib/models/dynamics/article_list/data.dart +++ b/lib/models/dynamics/article_list/data.dart @@ -1,11 +1,11 @@ -import 'package:PiliPlus/models/dynamics/article_list/article.dart'; -import 'package:PiliPlus/models/dynamics/article_list/author.dart'; import 'package:PiliPlus/models/dynamics/article_list/list.dart'; +import 'package:PiliPlus/models/model_owner.dart'; +import 'package:PiliPlus/models/space_article/item.dart'; class ArticleListData { ArticleList? list; - List
? articles; - Author? author; + List? articles; + Owner? author; bool? attention; ArticleListData({ @@ -21,18 +21,11 @@ class ArticleListData { ? null : ArticleList.fromJson(json['list'] as Map), articles: (json['articles'] as List?) - ?.map((e) => Article.fromJson(e as Map)) + ?.map((e) => SpaceArticleItem.fromJson(e as Map)) .toList(), author: json['author'] == null ? null - : Author.fromJson(json['author'] as Map), + : Owner.fromJson(json['author'] as Map), attention: json['attention'] as bool?, ); - - Map toJson() => { - 'list': list?.toJson(), - 'articles': articles?.map((e) => e.toJson()).toList(), - 'author': author?.toJson(), - 'attention': attention, - }; } diff --git a/lib/models/dynamics/article_list/stats.dart b/lib/models/dynamics/article_list/stats.dart deleted file mode 100644 index ba12f9dc..00000000 --- a/lib/models/dynamics/article_list/stats.dart +++ /dev/null @@ -1,43 +0,0 @@ -class Stats { - int? view; - int? favorite; - int? like; - int? dislike; - int? reply; - int? share; - int? coin; - int? dynam1c; - - Stats({ - this.view, - this.favorite, - this.like, - this.dislike, - this.reply, - this.share, - this.coin, - this.dynam1c, - }); - - factory Stats.fromJson(Map json) => Stats( - view: json['view'] as int?, - favorite: json['favorite'] as int?, - like: json['like'] as int?, - dislike: json['dislike'] as int?, - reply: json['reply'] as int?, - share: json['share'] as int?, - coin: json['coin'] as int?, - dynam1c: json['dynamic'] as int?, - ); - - Map toJson() => { - 'view': view, - 'favorite': favorite, - 'like': like, - 'dislike': dislike, - 'reply': reply, - 'share': share, - 'coin': coin, - 'dynamic': dynam1c, - }; -} diff --git a/lib/models/video/play/url.dart b/lib/models/video/play/url.dart index 9e040d33..10899c7f 100644 --- a/lib/models/video/play/url.dart +++ b/lib/models/video/play/url.dart @@ -136,24 +136,7 @@ bool _isMCDNorPCDN(String url) { _ipRegExp.hasMatch(url); } -class VideoItem { - VideoItem({ - this.id, - this.baseUrl, - this.backupUrl, - this.bandWidth, - this.mimeType, - this.codecs, - this.width, - this.height, - this.frameRate, - this.sar, - this.startWithSap, - this.segmentBase, - this.codecid, - this.quality, - }); - +abstract class BaseItem { int? id; String? baseUrl; String? backupUrl; @@ -167,16 +150,31 @@ class VideoItem { int? startWithSap; Map? segmentBase; int? codecid; - VideoQuality? quality; - VideoItem.fromJson(Map json) { + BaseItem({ + this.id, + this.baseUrl, + this.backupUrl, + this.bandWidth, + this.mimeType, + this.codecs, + this.width, + this.height, + this.frameRate, + this.sar, + this.startWithSap, + this.segmentBase, + this.codecid, + }); + + BaseItem.fromJson(Map json) { id = json['id']; baseUrl = json['baseUrl']; - var backupUrls = json['backupUrl']?.toList() ?? []; + final backupUrls = (json['backupUrl'] as List?)?.cast() ?? []; backupUrl = backupUrls.isNotEmpty ? backupUrls.firstWhere((i) => !_isMCDNorPCDN(i), orElse: () => backupUrls.first) - : ''; + : null; bandWidth = json['bandWidth']; mimeType = json['mime_type']; codecs = json['codecs']; @@ -187,82 +185,41 @@ class VideoItem { startWithSap = json['startWithSap']; segmentBase = json['segmentBase']; codecid = json['codecid']; - quality = VideoQuality.values.firstWhere((i) => i.code == json['id']); - } - - Map toJson() { - Map data = {}; - data['id'] = id; - data['baseUrl'] = baseUrl; - data['backupUrl'] = backupUrl; - data['bandWidth'] = bandWidth; - data['mime_type'] = mimeType; - data['codecs'] = codecs; - data['width'] = width; - data['height'] = height; - data['frameRate'] = frameRate; - data['sar'] = sar; - data['startWithSap'] = startWithSap; - data['segmentBase'] = segmentBase; - data['codecid'] = codecid; - data['quality'] = quality; - return data; } } -class AudioItem { - AudioItem({ - this.id, - this.baseUrl, - this.backupUrl, - this.bandWidth, - this.mimeType, - this.codecs, - this.width, - this.height, - this.frameRate, - this.sar, - this.startWithSap, - this.segmentBase, - this.codecid, - this.quality, +class VideoItem extends BaseItem { + late VideoQuality quality; + + VideoItem({ + super.id, + super.baseUrl, + super.backupUrl, + super.bandWidth, + super.mimeType, + super.codecs, + super.width, + super.height, + super.frameRate, + super.sar, + super.startWithSap, + super.segmentBase, + super.codecid, + required this.quality, }); - int? id; - String? baseUrl; - String? backupUrl; - int? bandWidth; - String? mimeType; - String? codecs; - int? width; - int? height; - String? frameRate; - String? sar; - int? startWithSap; - Map? segmentBase; - int? codecid; - String? quality; + VideoItem.fromJson(Map json) : super.fromJson(json) { + quality = VideoQuality.fromCode(json['id']); + } +} - AudioItem.fromJson(Map json) { - id = json['id']; - baseUrl = json['baseUrl']; - var backupUrls = json['backupUrl']?.toList() ?? []; - backupUrl = backupUrls.isNotEmpty - ? backupUrls.firstWhere((i) => !_isMCDNorPCDN(i), - orElse: () => backupUrls.first) - : ''; - bandWidth = json['bandWidth']; - mimeType = json['mime_type']; - codecs = json['codecs']; - width = json['width']; - height = json['height']; - frameRate = json['frameRate']; - sar = json['sar']; - startWithSap = json['startWithSap']; - segmentBase = json['segmentBase']; - codecid = json['codecid']; - quality = - AudioQuality.values.firstWhere((i) => i.code == json['id']).description; +class AudioItem extends BaseItem { + late String quality; + + AudioItem(); + + AudioItem.fromJson(Map json) : super.fromJson(json) { + quality = AudioQuality.fromCode(json['id']).description; } } diff --git a/lib/pages/article_list/controller.dart b/lib/pages/article_list/controller.dart index 6f615106..147eb03b 100644 --- a/lib/pages/article_list/controller.dart +++ b/lib/pages/article_list/controller.dart @@ -1,14 +1,14 @@ import 'package:PiliPlus/http/dynamics.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models/dynamics/article_list/article.dart'; -import 'package:PiliPlus/models/dynamics/article_list/author.dart'; import 'package:PiliPlus/models/dynamics/article_list/data.dart'; import 'package:PiliPlus/models/dynamics/article_list/list.dart'; +import 'package:PiliPlus/models/model_owner.dart'; +import 'package:PiliPlus/models/space_article/item.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; import 'package:get/get.dart'; class ArticleListController - extends CommonListController { + extends CommonListController { final id = Get.parameters['id']; @override @@ -18,10 +18,10 @@ class ArticleListController } Rx list = Rx(null); - Author? author; + Owner? author; @override - List
? getDataList(ArticleListData response) { + List? getDataList(ArticleListData response) { list.value = response.list; author = response.author; return response.articles; diff --git a/lib/pages/article_list/view.dart b/lib/pages/article_list/view.dart index a0baa398..37505fc5 100644 --- a/lib/pages/article_list/view.dart +++ b/lib/pages/article_list/view.dart @@ -5,8 +5,8 @@ import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/image_type.dart'; -import 'package:PiliPlus/models/dynamics/article_list/article.dart'; import 'package:PiliPlus/models/dynamics/article_list/list.dart'; +import 'package:PiliPlus/models/space_article/item.dart'; import 'package:PiliPlus/pages/article_list/controller.dart'; import 'package:PiliPlus/pages/article_list/widgets/item.dart'; import 'package:PiliPlus/utils/grid.dart'; @@ -51,7 +51,7 @@ class _ArticleListPageState extends State { } Widget _buildBody( - ThemeData theme, LoadingState?> loadingState) { + ThemeData theme, LoadingState?> loadingState) { return switch (loadingState) { Loading() => SliverPadding( padding: EdgeInsets.only( diff --git a/lib/pages/article_list/widgets/item.dart b/lib/pages/article_list/widgets/item.dart index dd6a7008..a83fd276 100644 --- a/lib/pages/article_list/widgets/item.dart +++ b/lib/pages/article_list/widgets/item.dart @@ -1,7 +1,7 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart'; -import 'package:PiliPlus/models/dynamics/article_list/article.dart'; +import 'package:PiliPlus/models/space_article/item.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -11,7 +11,7 @@ class ArticleListItem extends StatelessWidget { required this.item, }); - final Article item; + final SpaceArticleItem item; @override Widget build(BuildContext context) { diff --git a/lib/pages/setting/widgets/model.dart b/lib/pages/setting/widgets/model.dart index c387c6db..20e185c7 100644 --- a/lib/pages/setting/widgets/model.dart +++ b/lib/pages/setting/widgets/model.dart @@ -1064,7 +1064,7 @@ List get videoSettings => [ title: '默认画质', leading: const Icon(Icons.video_settings_outlined), getSubtitle: () => - '当前画质:${VideoQualityExt.fromCode(GStorage.defaultVideoQa)!.description}', + '当前画质:${VideoQuality.fromCode(GStorage.defaultVideoQa).description}', onTap: (setState) async { int? result = await showDialog( context: Get.context!, @@ -1089,7 +1089,7 @@ List get videoSettings => [ title: '蜂窝网络画质', leading: const Icon(Icons.video_settings_outlined), getSubtitle: () => - '当前画质:${VideoQualityExt.fromCode(GStorage.defaultVideoQaCellular)!.description}', + '当前画质:${VideoQuality.fromCode(GStorage.defaultVideoQaCellular).description}', onTap: (setState) async { int? result = await showDialog( context: Get.context!, @@ -1115,7 +1115,7 @@ List get videoSettings => [ title: '默认音质', leading: const Icon(Icons.music_video_outlined), getSubtitle: () => - '当前音质:${AudioQualityExt.fromCode(GStorage.defaultAudioQa)!.description}', + '当前音质:${AudioQuality.fromCode(GStorage.defaultAudioQa).description}', onTap: (setState) async { int? result = await showDialog( context: Get.context!, @@ -1140,7 +1140,7 @@ List get videoSettings => [ title: '蜂窝网络音质', leading: const Icon(Icons.music_video_outlined), getSubtitle: () => - '当前音质:${AudioQualityExt.fromCode(GStorage.defaultAudioQaCellular)!.description}', + '当前音质:${AudioQuality.fromCode(GStorage.defaultAudioQaCellular).description}', onTap: (setState) async { int? result = await showDialog( context: Get.context!, diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index 5cb3dd41..c23fc782 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -1169,10 +1169,10 @@ class VideoDetailController extends GetxController id: data.quality!, baseUrl: videoUrl, codecs: 'avc1', - quality: VideoQualityExt.fromCode(data.quality!)!); + quality: VideoQuality.fromCode(data.quality!)); setVideoHeight(); currentDecodeFormats = VideoDecodeFormatTypeExt.fromString('avc1')!; - currentVideoQa = VideoQualityExt.fromCode(data.quality!)!; + currentVideoQa = VideoQuality.fromCode(data.quality!); if (autoPlay.value) { isShowCover.value = false; await playerInit(); @@ -1196,7 +1196,7 @@ class VideoDetailController extends GetxController final List allVideosList = data.dash!.video!; // debugPrint("allVideosList:${allVideosList}"); // 当前可播放的最高质量视频 - int currentHighVideoQa = allVideosList.first.quality!.code; + int currentHighVideoQa = allVideosList.first.quality.code; // 预设的画质为null,则当前可用的最高质量 int resVideoQa = currentHighVideoQa; if (plPlayerController.cacheVideoQa! <= currentHighVideoQa) { @@ -1206,11 +1206,11 @@ class VideoDetailController extends GetxController resVideoQa = Utils.findClosestNumber(plPlayerController.cacheVideoQa!, numbers); } - currentVideoQa = VideoQualityExt.fromCode(resVideoQa)!; + currentVideoQa = VideoQuality.fromCode(resVideoQa); /// 取出符合当前画质的videoList final List videosList = - allVideosList.where((e) => e.quality!.code == resVideoQa).toList(); + allVideosList.where((e) => e.quality.code == resVideoQa).toList(); /// 优先顺序 设置中指定解码格式 -> 当前可选的首个解码格式 final List supportFormats = data.supportFormats!; @@ -1274,7 +1274,7 @@ class VideoDetailController extends GetxController orElse: () => audiosList.first); audioUrl = VideoUtils.getCdnUrl(firstAudio); if (firstAudio.id != null) { - currentAudioQa = AudioQualityExt.fromCode(firstAudio.id!)!; + currentAudioQa = AudioQuality.fromCode(firstAudio.id!); } } else { firstAudio = AudioItem(); diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index b9e78754..84f929ae 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -650,7 +650,7 @@ class HeaderControlState extends State { final int quality = videoFormat[i].quality!; videoDetailCtr ..currentVideoQa = - VideoQualityExt.fromCode(quality)! + VideoQuality.fromCode(quality) ..updatePlayer(); // update @@ -659,16 +659,16 @@ class HeaderControlState extends State { .checkConnectivity() .then((res) { if (res.contains(ConnectivityResult.wifi)) { - oldQualityDesc = VideoQualityExt.fromCode( - GStorage.defaultVideoQa)! + oldQualityDesc = VideoQuality.fromCode( + GStorage.defaultVideoQa) .description; setting.put( SettingBoxKey.defaultVideoQa, quality, ); } else { - oldQualityDesc = VideoQualityExt.fromCode( - GStorage.defaultVideoQaCellular)! + oldQualityDesc = VideoQuality.fromCode( + GStorage.defaultVideoQaCellular) .description; setting.put( SettingBoxKey.defaultVideoQaCellular, @@ -677,7 +677,7 @@ class HeaderControlState extends State { } }); SmartDialog.showToast( - "默认画质由:$oldQualityDesc 变为:${VideoQualityExt.fromCode(quality)!.description}", + "默认画质由:$oldQualityDesc 变为:${VideoQuality.fromCode(quality).description}", ); }, // 可能包含会员解锁画质 @@ -745,7 +745,7 @@ class HeaderControlState extends State { final int quality = i.id!; videoDetailCtr ..currentAudioQa = - AudioQualityExt.fromCode(quality)! + AudioQuality.fromCode(quality) ..updatePlayer(); // update @@ -754,16 +754,16 @@ class HeaderControlState extends State { .checkConnectivity() .then((res) { if (res.contains(ConnectivityResult.wifi)) { - oldQualityDesc = AudioQualityExt.fromCode( - GStorage.defaultAudioQa)! + oldQualityDesc = AudioQuality.fromCode( + GStorage.defaultAudioQa) .description; setting.put( SettingBoxKey.defaultAudioQa, quality, ); } else { - oldQualityDesc = AudioQualityExt.fromCode( - GStorage.defaultAudioQaCellular)! + oldQualityDesc = AudioQuality.fromCode( + GStorage.defaultAudioQaCellular) .description; setting.put( SettingBoxKey.defaultAudioQaCellular, @@ -772,12 +772,12 @@ class HeaderControlState extends State { } }); SmartDialog.showToast( - "默认音质由:$oldQualityDesc 变为:${AudioQualityExt.fromCode(quality)!.description}", + "默认音质由:$oldQualityDesc 变为:${AudioQuality.fromCode(quality).description}", ); }, contentPadding: const EdgeInsets.only(left: 20, right: 20), - title: Text(i.quality!), + title: Text(i.quality), subtitle: Text( i.codecs!, style: subTitleStyle, @@ -811,7 +811,7 @@ class HeaderControlState extends State { // 当前视频可用的解码格式 final List videoFormat = videoInfo.supportFormats!; final List? list = videoFormat - .firstWhere((FormatItem e) => e.quality == firstVideo.quality!.code) + .firstWhere((FormatItem e) => e.quality == firstVideo.quality.code) .codecs; if (list == null) { SmartDialog.showToast('当前视频不支持选择解码格式');