mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-05-30 23:58:13 +08:00
fix: 评论区表情suggest解析错误,评论区非空错误
This commit is contained in:
@@ -6,7 +6,7 @@ class MyEmote {
|
|||||||
|
|
||||||
MyEmote.fromJson(Map<String, dynamic> json) {
|
MyEmote.fromJson(Map<String, dynamic> json) {
|
||||||
setting =
|
setting =
|
||||||
json['setting'] != null ? Setting.fromJson(json['setting']) : null;
|
json['setting'] != null ? Setting.fromJson(json['setting']) : null;
|
||||||
if (json['packages'] != null) {
|
if (json['packages'] != null) {
|
||||||
packages = <Packages>[];
|
packages = <Packages>[];
|
||||||
json['packages'].forEach((v) {
|
json['packages'].forEach((v) {
|
||||||
@@ -62,23 +62,23 @@ class Packages {
|
|||||||
PackagesMeta? meta;
|
PackagesMeta? meta;
|
||||||
List<Emote>? emote;
|
List<Emote>? emote;
|
||||||
PackagesFlags? flags;
|
PackagesFlags? flags;
|
||||||
dynamic label;
|
Label? label;
|
||||||
String? packageSubTitle;
|
String? packageSubTitle;
|
||||||
int? refMid;
|
int? refMid;
|
||||||
|
|
||||||
Packages(
|
Packages(
|
||||||
{this.id,
|
{this.id,
|
||||||
this.text,
|
this.text,
|
||||||
this.url,
|
this.url,
|
||||||
this.mtime,
|
this.mtime,
|
||||||
this.type,
|
this.type,
|
||||||
this.attr,
|
this.attr,
|
||||||
this.meta,
|
this.meta,
|
||||||
this.emote,
|
this.emote,
|
||||||
this.flags,
|
this.flags,
|
||||||
this.label,
|
this.label,
|
||||||
this.packageSubTitle,
|
this.packageSubTitle,
|
||||||
this.refMid});
|
this.refMid});
|
||||||
|
|
||||||
Packages.fromJson(Map<String, dynamic> json) {
|
Packages.fromJson(Map<String, dynamic> json) {
|
||||||
id = json['id'];
|
id = json['id'];
|
||||||
@@ -94,8 +94,9 @@ class Packages {
|
|||||||
emote!.add(Emote.fromJson(v));
|
emote!.add(Emote.fromJson(v));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
flags = json['flags'] != null ? PackagesFlags.fromJson(json['flags']) : null;
|
flags =
|
||||||
label = json['label'];
|
json['flags'] != null ? PackagesFlags.fromJson(json['flags']) : null;
|
||||||
|
label = json['label'] != null ? Label.fromJson(json['label']) : null;
|
||||||
packageSubTitle = json['package_sub_title'];
|
packageSubTitle = json['package_sub_title'];
|
||||||
refMid = json['ref_mid'];
|
refMid = json['ref_mid'];
|
||||||
}
|
}
|
||||||
@@ -117,28 +118,58 @@ class Packages {
|
|||||||
if (flags != null) {
|
if (flags != null) {
|
||||||
data['flags'] = flags!.toJson();
|
data['flags'] = flags!.toJson();
|
||||||
}
|
}
|
||||||
data['label'] = label;
|
if (label != null) {
|
||||||
|
data['label'] = label!.toJson();
|
||||||
|
}
|
||||||
data['package_sub_title'] = packageSubTitle;
|
data['package_sub_title'] = packageSubTitle;
|
||||||
data['ref_mid'] = refMid;
|
data['ref_mid'] = refMid;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Label {
|
||||||
|
String? fontColor;
|
||||||
|
String? backgroundColor;
|
||||||
|
String? text;
|
||||||
|
|
||||||
|
Label({this.fontColor, this.backgroundColor, this.text});
|
||||||
|
|
||||||
|
Label.fromJson(Map<String, dynamic> json) {
|
||||||
|
fontColor = json['font_color'];
|
||||||
|
backgroundColor = json['background_color'];
|
||||||
|
text = json['text'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
|
data['font_color'] = fontColor;
|
||||||
|
data['background_color'] = backgroundColor;
|
||||||
|
data['text'] = text;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class PackagesMeta {
|
class PackagesMeta {
|
||||||
int? size;
|
int? size;
|
||||||
int? itemId;
|
int? itemId;
|
||||||
|
String? itemUrl;
|
||||||
|
int? assetId;
|
||||||
|
|
||||||
PackagesMeta({this.size, this.itemId});
|
PackagesMeta({this.size, this.itemId, this.itemUrl, this.assetId});
|
||||||
|
|
||||||
PackagesMeta.fromJson(Map<String, dynamic> json) {
|
PackagesMeta.fromJson(Map<String, dynamic> json) {
|
||||||
size = json['size'];
|
size = json['size'];
|
||||||
itemId = json['item_id'];
|
itemId = json['item_id'];
|
||||||
|
itemUrl = json['item_url'];
|
||||||
|
assetId = json['asset_id'];
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final Map<String, dynamic> data = <String, dynamic>{};
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
data['size'] = size;
|
data['size'] = size;
|
||||||
data['item_id'] = itemId;
|
data['item_id'] = itemId;
|
||||||
|
data['item_url'] = itemUrl;
|
||||||
|
data['asset_id'] = assetId;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -158,16 +189,16 @@ class Emote {
|
|||||||
|
|
||||||
Emote(
|
Emote(
|
||||||
{this.id,
|
{this.id,
|
||||||
this.packageId,
|
this.packageId,
|
||||||
this.text,
|
this.text,
|
||||||
this.url,
|
this.url,
|
||||||
this.mtime,
|
this.mtime,
|
||||||
this.type,
|
this.type,
|
||||||
this.attr,
|
this.attr,
|
||||||
this.meta,
|
this.meta,
|
||||||
this.flags,
|
this.flags,
|
||||||
this.activity,
|
this.activity,
|
||||||
this.gifUrl});
|
this.gifUrl});
|
||||||
|
|
||||||
Emote.fromJson(Map<String, dynamic> json) {
|
Emote.fromJson(Map<String, dynamic> json) {
|
||||||
id = json['id'];
|
id = json['id'];
|
||||||
@@ -214,7 +245,9 @@ class EmoteMeta {
|
|||||||
|
|
||||||
EmoteMeta.fromJson(Map<String, dynamic> json) {
|
EmoteMeta.fromJson(Map<String, dynamic> json) {
|
||||||
size = json['size'];
|
size = json['size'];
|
||||||
suggest = json['suggest'].cast<String>();
|
suggest = json['suggest'] == null
|
||||||
|
? null
|
||||||
|
: List<String>.from(json['suggest'].map((x) => x));
|
||||||
alias = json['alias'];
|
alias = json['alias'];
|
||||||
gifUrl = json['gif_url'];
|
gifUrl = json['gif_url'];
|
||||||
}
|
}
|
||||||
@@ -231,16 +264,18 @@ class EmoteMeta {
|
|||||||
|
|
||||||
class EmoteFlags {
|
class EmoteFlags {
|
||||||
bool? unlocked;
|
bool? unlocked;
|
||||||
|
bool? recentUseForbid;
|
||||||
|
|
||||||
EmoteFlags({this.unlocked});
|
EmoteFlags({this.unlocked, this.recentUseForbid});
|
||||||
|
|
||||||
EmoteFlags.fromJson(Map<String, dynamic> json) {
|
EmoteFlags.fromJson(Map<String, dynamic> json) {
|
||||||
unlocked = json['unlocked'];
|
unlocked = json['unlocked'];
|
||||||
|
recentUseForbid = json['recent_use_forbid'];
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final Map<String, dynamic> data = <String, dynamic>{};
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
data['unlocked'] = unlocked;
|
data['unlocked'] = unlocked;
|
||||||
|
data['recent_use_forbid'] = recentUseForbid;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
import 'package:PiliPalaX/models/user/my_emote.dart';
|
import 'package:PiliPalaX/models/user/my_emote.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
@@ -42,13 +43,15 @@ class _EmoteTabState extends State<EmoteTab> with TickerProviderStateMixin {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return FutureBuilder(
|
return FutureBuilder(
|
||||||
future: futureBuild,
|
future: futureBuild,
|
||||||
builder: (BuildContext context, AsyncSnapshot snapshot) {
|
builder: (BuildContext context, AsyncSnapshot snapshot) {
|
||||||
if (snapshot.connectionState == ConnectionState.done &&
|
if (snapshot.connectionState == ConnectionState.done &&
|
||||||
myEmote.packages != null) {
|
myEmote != null &&
|
||||||
return Column(
|
myEmote.packages != null) {
|
||||||
children: [
|
return Column(
|
||||||
Expanded(child: TabBarView(controller: _myEmoteTabController, children: [
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: TabBarView(controller: _myEmoteTabController, children: [
|
||||||
for (Packages i in myEmote.packages!) ...<Widget>[
|
for (Packages i in myEmote.packages!) ...<Widget>[
|
||||||
GridView.builder(
|
GridView.builder(
|
||||||
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
|
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
|
||||||
@@ -64,41 +67,46 @@ class _EmoteTabState extends State<EmoteTab> with TickerProviderStateMixin {
|
|||||||
widget.onEmoteTap(i.emote![index].text!);
|
widget.onEmoteTap(i.emote![index].text!);
|
||||||
},
|
},
|
||||||
child: i.type == 4
|
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(
|
: NetworkImgLayer(
|
||||||
width: 36,
|
width: 36,
|
||||||
height: 36,
|
height: 36,
|
||||||
type: 'emote',
|
type: 'emote',
|
||||||
src: i.emote![index].url,
|
src: i.emote![index].url?.split("@")[0]
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
]),),
|
]),
|
||||||
SizedBox(
|
),
|
||||||
height: 45,
|
SizedBox(
|
||||||
child: TabBar(
|
height: 45,
|
||||||
isScrollable: true,
|
child: TabBar(
|
||||||
controller: _myEmoteTabController,
|
isScrollable: true,
|
||||||
tabs: [
|
controller: _myEmoteTabController,
|
||||||
for (var i in myEmote.packages!)
|
tabs: [
|
||||||
NetworkImgLayer(
|
for (var i in myEmote.packages!)
|
||||||
width: 36,
|
NetworkImgLayer(
|
||||||
height: 36,
|
width: 36,
|
||||||
type: 'emote',
|
height: 36,
|
||||||
src: i.url,
|
type: 'emote',
|
||||||
),
|
src: i.url,
|
||||||
],
|
),
|
||||||
))
|
],
|
||||||
],
|
))
|
||||||
);
|
],
|
||||||
} else {
|
);
|
||||||
return const Center(
|
} else {
|
||||||
child: CircularProgressIndicator(),
|
return const Center(
|
||||||
);
|
child: CircularProgressIndicator(),
|
||||||
}
|
);
|
||||||
},
|
}
|
||||||
);
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,6 +129,7 @@ class ReplyItem extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget content(BuildContext context) {
|
Widget content(BuildContext context) {
|
||||||
|
if (replyItem?.member == null) return const SizedBox();
|
||||||
final String heroTag = Utils.makeHeroTag(replyItem!.mid);
|
final String heroTag = Utils.makeHeroTag(replyItem!.mid);
|
||||||
return Column(
|
return Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
|||||||
Reference in New Issue
Block a user