diff --git a/lib/models/user/my_emote.dart b/lib/models/user/my_emote.dart index 30301f137..62a6916e5 100644 --- a/lib/models/user/my_emote.dart +++ b/lib/models/user/my_emote.dart @@ -6,7 +6,7 @@ class MyEmote { MyEmote.fromJson(Map json) { setting = - json['setting'] != null ? Setting.fromJson(json['setting']) : null; + json['setting'] != null ? Setting.fromJson(json['setting']) : null; if (json['packages'] != null) { packages = []; json['packages'].forEach((v) { @@ -62,23 +62,23 @@ class Packages { PackagesMeta? meta; List? emote; PackagesFlags? flags; - dynamic label; + Label? label; String? packageSubTitle; int? refMid; Packages( {this.id, - this.text, - this.url, - this.mtime, - this.type, - this.attr, - this.meta, - this.emote, - this.flags, - this.label, - this.packageSubTitle, - this.refMid}); + this.text, + this.url, + this.mtime, + this.type, + this.attr, + this.meta, + this.emote, + this.flags, + this.label, + this.packageSubTitle, + this.refMid}); Packages.fromJson(Map json) { id = json['id']; @@ -94,8 +94,9 @@ class Packages { emote!.add(Emote.fromJson(v)); }); } - flags = json['flags'] != null ? PackagesFlags.fromJson(json['flags']) : null; - label = json['label']; + flags = + json['flags'] != null ? PackagesFlags.fromJson(json['flags']) : null; + label = json['label'] != null ? Label.fromJson(json['label']) : null; packageSubTitle = json['package_sub_title']; refMid = json['ref_mid']; } @@ -117,28 +118,58 @@ class Packages { if (flags != null) { data['flags'] = flags!.toJson(); } - data['label'] = label; + if (label != null) { + data['label'] = label!.toJson(); + } data['package_sub_title'] = packageSubTitle; data['ref_mid'] = refMid; return data; } } +class Label { + String? fontColor; + String? backgroundColor; + String? text; + + Label({this.fontColor, this.backgroundColor, this.text}); + + Label.fromJson(Map json) { + fontColor = json['font_color']; + backgroundColor = json['background_color']; + text = json['text']; + } + + Map toJson() { + final Map data = {}; + data['font_color'] = fontColor; + data['background_color'] = backgroundColor; + data['text'] = text; + return data; + } +} + class PackagesMeta { int? size; int? itemId; + String? itemUrl; + int? assetId; - PackagesMeta({this.size, this.itemId}); + PackagesMeta({this.size, this.itemId, this.itemUrl, this.assetId}); PackagesMeta.fromJson(Map json) { size = json['size']; itemId = json['item_id']; + itemUrl = json['item_url']; + assetId = json['asset_id']; } Map toJson() { final Map data = {}; data['size'] = size; data['item_id'] = itemId; + data['item_url'] = itemUrl; + data['asset_id'] = assetId; return data; } } @@ -158,16 +189,16 @@ class Emote { Emote( {this.id, - this.packageId, - this.text, - this.url, - this.mtime, - this.type, - this.attr, - this.meta, - this.flags, - this.activity, - this.gifUrl}); + this.packageId, + this.text, + this.url, + this.mtime, + this.type, + this.attr, + this.meta, + this.flags, + this.activity, + this.gifUrl}); Emote.fromJson(Map json) { id = json['id']; @@ -214,7 +245,9 @@ class EmoteMeta { EmoteMeta.fromJson(Map json) { size = json['size']; - suggest = json['suggest'].cast(); + suggest = json['suggest'] == null + ? null + : List.from(json['suggest'].map((x) => x)); alias = json['alias']; gifUrl = json['gif_url']; } @@ -231,16 +264,18 @@ class EmoteMeta { class EmoteFlags { bool? unlocked; + bool? recentUseForbid; - EmoteFlags({this.unlocked}); - + EmoteFlags({this.unlocked, this.recentUseForbid}); EmoteFlags.fromJson(Map json) { unlocked = json['unlocked']; + recentUseForbid = json['recent_use_forbid']; } Map toJson() { final Map data = {}; data['unlocked'] = unlocked; + data['recent_use_forbid'] = recentUseForbid; return data; } } diff --git a/lib/pages/video/detail/reply/reply_emote/view.dart b/lib/pages/video/detail/reply/reply_emote/view.dart index 297877b7e..bae50cf6b 100644 --- a/lib/pages/video/detail/reply/reply_emote/view.dart +++ b/lib/pages/video/detail/reply/reply_emote/view.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'package:PiliPalaX/models/user/my_emote.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -42,13 +43,15 @@ class _EmoteTabState extends State with TickerProviderStateMixin { @override Widget build(BuildContext context) { return FutureBuilder( - future: futureBuild, - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.done && - myEmote.packages != null) { - return Column( - children: [ - Expanded(child: TabBarView(controller: _myEmoteTabController, children: [ + future: futureBuild, + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.done && + myEmote != null && + myEmote.packages != null) { + return Column( + children: [ + Expanded( + child: TabBarView(controller: _myEmoteTabController, children: [ for (Packages i in myEmote.packages!) ...[ GridView.builder( gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( @@ -64,41 +67,46 @@ class _EmoteTabState extends State with TickerProviderStateMixin { widget.onEmoteTap(i.emote![index].text!); }, child: i.type == 4 - ? Text(i.emote![index].text!,overflow: TextOverflow.clip,maxLines: 1,) + ? Text( + i.emote![index].text!, + overflow: TextOverflow.clip, + maxLines: 1, + ) : NetworkImgLayer( - width: 36, - height: 36, - type: 'emote', - src: i.emote![index].url, - ), + width: 36, + height: 36, + type: 'emote', + src: i.emote![index].url?.split("@")[0] + ), ); }, ), ], - ]),), - SizedBox( - height: 45, - child: TabBar( - isScrollable: true, - controller: _myEmoteTabController, - tabs: [ - for (var i in myEmote.packages!) - NetworkImgLayer( - width: 36, - height: 36, - type: 'emote', - src: i.url, - ), - ], - )) - ], - ); - } else { - return const Center( - child: CircularProgressIndicator(), - ); - } - }, - ); + ]), + ), + SizedBox( + height: 45, + child: TabBar( + isScrollable: true, + controller: _myEmoteTabController, + tabs: [ + for (var i in myEmote.packages!) + NetworkImgLayer( + width: 36, + height: 36, + type: 'emote', + src: i.url, + ), + ], + )) + ], + ); + } else { + return const Center( + child: CircularProgressIndicator(), + ); + } + }, + ); } } diff --git a/lib/pages/video/detail/reply/widgets/reply_item.dart b/lib/pages/video/detail/reply/widgets/reply_item.dart index ee194d294..efeeb1f91 100644 --- a/lib/pages/video/detail/reply/widgets/reply_item.dart +++ b/lib/pages/video/detail/reply/widgets/reply_item.dart @@ -129,6 +129,7 @@ class ReplyItem extends StatelessWidget { } Widget content(BuildContext context) { + if (replyItem?.member == null) return const SizedBox(); final String heroTag = Utils.makeHeroTag(replyItem!.mid); return Column( crossAxisAlignment: CrossAxisAlignment.start,