mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
refactor: emote
This commit is contained in:
@@ -96,22 +96,16 @@ class ReplyHttp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future getEmoteList({String? business}) async {
|
static Future<LoadingState> getEmoteList({String? business}) async {
|
||||||
var res = await Request().get(Api.myEmote, data: {
|
var res = await Request().get(Api.myEmote, data: {
|
||||||
'business': business ?? 'reply',
|
'business': business ?? 'reply',
|
||||||
'web_location': '333.1245',
|
'web_location': '333.1245',
|
||||||
});
|
});
|
||||||
if (res.data['code'] == 0) {
|
if (res.data['code'] == 0) {
|
||||||
return {
|
return LoadingState.success(
|
||||||
'status': true,
|
EmoteModelData.fromJson(res.data['data']).packages);
|
||||||
'data': EmoteModelData.fromJson(res.data['data']),
|
|
||||||
};
|
|
||||||
} else {
|
} else {
|
||||||
return {
|
return LoadingState.error(res.data['message']);
|
||||||
'status': false,
|
|
||||||
'date': [],
|
|
||||||
'msg': res.data['message'],
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class BangumiIntroController extends CommonController {
|
|||||||
// 关注状态 默认未关注
|
// 关注状态 默认未关注
|
||||||
RxMap followStatus = {}.obs;
|
RxMap followStatus = {}.obs;
|
||||||
int _tempThemeValue = -1;
|
int _tempThemeValue = -1;
|
||||||
var userInfo;
|
dynamic userInfo;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ abstract class ReplyController extends CommonController {
|
|||||||
dynamic replyItem,
|
dynamic replyItem,
|
||||||
int index = 0,
|
int index = 0,
|
||||||
}) {
|
}) {
|
||||||
dynamic key = oid ?? replyItem.oid + replyItem.rpid + replyItem.rpid;
|
dynamic key = oid ?? replyItem.oid + replyItem.rpid;
|
||||||
Navigator.of(context)
|
Navigator.of(context)
|
||||||
.push(
|
.push(
|
||||||
GetDialogRoute(
|
GetDialogRoute(
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ class DynamicsTabController extends CommonController {
|
|||||||
@override
|
@override
|
||||||
Future onRefresh() async {
|
Future onRefresh() async {
|
||||||
offset = '';
|
offset = '';
|
||||||
print('11111111111111111111111111111111 $dynamicsType,,$mid');
|
|
||||||
await queryData();
|
await queryData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class _UpPanelState extends State<UpPanel> {
|
|||||||
List<UpItem> upList = [];
|
List<UpItem> upList = [];
|
||||||
List<LiveUserItem> liveList = [];
|
List<LiveUserItem> liveList = [];
|
||||||
Box userInfoCache = GStorage.userInfo;
|
Box userInfoCache = GStorage.userInfo;
|
||||||
var userInfo;
|
dynamic userInfo;
|
||||||
bool _showLiveItems = false;
|
bool _showLiveItems = false;
|
||||||
late DynamicsController dynamicsController;
|
late DynamicsController dynamicsController;
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,29 @@
|
|||||||
|
import 'package:PiliPalaX/http/loading_state.dart';
|
||||||
|
import 'package:PiliPalaX/pages/common/common_controller.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
import '../../http/reply.dart';
|
import '../../http/reply.dart';
|
||||||
import '../../models/video/reply/emote.dart';
|
|
||||||
|
|
||||||
class EmotePanelController extends GetxController
|
class EmotePanelController extends CommonController
|
||||||
with GetTickerProviderStateMixin {
|
with GetTickerProviderStateMixin {
|
||||||
late List<Packages> emotePackage;
|
|
||||||
late TabController tabController;
|
late TabController tabController;
|
||||||
|
|
||||||
Future getEmote() async {
|
@override
|
||||||
var res = await ReplyHttp.getEmoteList(business: 'reply');
|
void onInit() {
|
||||||
if (res['status']) {
|
super.onInit();
|
||||||
emotePackage = res['data'].packages;
|
queryData();
|
||||||
tabController = TabController(length: emotePackage.length, vsync: this);
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool customHandleResponse(Success response) {
|
||||||
|
tabController =
|
||||||
|
TabController(length: response.response.length, vsync: this);
|
||||||
|
loadingState.value = response;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<LoadingState> customGetData() =>
|
||||||
|
ReplyHttp.getEmoteList(business: 'reply');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
import 'package:PiliPalaX/http/loading_state.dart';
|
||||||
|
import 'package:PiliPalaX/models/video/reply/emote.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import '../../common/widgets/network_img_layer.dart';
|
import '../../common/widgets/network_img_layer.dart';
|
||||||
import '../../models/video/reply/emote.dart';
|
|
||||||
import 'controller.dart';
|
import 'controller.dart';
|
||||||
|
|
||||||
class EmotePanel extends StatefulWidget {
|
class EmotePanel extends StatefulWidget {
|
||||||
@@ -16,116 +17,101 @@ class _EmotePanelState extends State<EmotePanel>
|
|||||||
with AutomaticKeepAliveClientMixin {
|
with AutomaticKeepAliveClientMixin {
|
||||||
final EmotePanelController _emotePanelController =
|
final EmotePanelController _emotePanelController =
|
||||||
Get.put(EmotePanelController());
|
Get.put(EmotePanelController());
|
||||||
late Future _futureBuilderFuture;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get wantKeepAlive => true;
|
bool get wantKeepAlive => true;
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
_futureBuilderFuture = _emotePanelController.getEmote();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
super.build(context);
|
super.build(context);
|
||||||
return FutureBuilder(
|
return Obx(() => _buildBody(_emotePanelController.loadingState.value));
|
||||||
future: _futureBuilderFuture,
|
}
|
||||||
builder: (context, snapshot) {
|
|
||||||
if (snapshot.connectionState == ConnectionState.done) {
|
|
||||||
Map data = snapshot.data as Map;
|
|
||||||
if (data['status']) {
|
|
||||||
List<Packages> emotePackage = _emotePanelController.emotePackage;
|
|
||||||
|
|
||||||
return Column(
|
Widget _buildBody(LoadingState loadingState) {
|
||||||
children: [
|
return loadingState is Success
|
||||||
Expanded(
|
? Column(
|
||||||
child: TabBarView(
|
children: [
|
||||||
controller: _emotePanelController.tabController,
|
Expanded(
|
||||||
children: emotePackage.map(
|
child: TabBarView(
|
||||||
(e) {
|
controller: _emotePanelController.tabController,
|
||||||
int size = e.emote!.first.meta!.size!;
|
children: (loadingState.response as List<Packages>).map(
|
||||||
int type = e.type!;
|
(e) {
|
||||||
return Padding(
|
int size = e.emote!.first.meta!.size!;
|
||||||
padding: const EdgeInsets.fromLTRB(12, 6, 12, 0),
|
int type = e.type!;
|
||||||
child: GridView.builder(
|
return Padding(
|
||||||
gridDelegate:
|
padding: const EdgeInsets.fromLTRB(12, 6, 12, 0),
|
||||||
SliverGridDelegateWithMaxCrossAxisExtent(
|
child: GridView.builder(
|
||||||
maxCrossAxisExtent:
|
gridDelegate:
|
||||||
type == 4 ? 100 : (size == 1 ? 40 : 60),
|
SliverGridDelegateWithMaxCrossAxisExtent(
|
||||||
crossAxisSpacing: 8,
|
maxCrossAxisExtent:
|
||||||
mainAxisSpacing: 8,
|
type == 4 ? 100 : (size == 1 ? 40 : 60),
|
||||||
mainAxisExtent: size == 1 ? 40 : 60,
|
crossAxisSpacing: 8,
|
||||||
),
|
mainAxisSpacing: 8,
|
||||||
itemCount: e.emote!.length,
|
mainAxisExtent: size == 1 ? 40 : 60,
|
||||||
itemBuilder: (context, index) {
|
|
||||||
return Material(
|
|
||||||
color: Colors.transparent,
|
|
||||||
child: InkWell(
|
|
||||||
borderRadius: BorderRadius.circular(8),
|
|
||||||
onTap: () {
|
|
||||||
widget.onChoose(e, e.emote![index]);
|
|
||||||
},
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(6),
|
|
||||||
child: type == 4
|
|
||||||
? Center(
|
|
||||||
child: Text(
|
|
||||||
e.emote![index].text!,
|
|
||||||
overflow: TextOverflow.clip,
|
|
||||||
maxLines: 1,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: NetworkImgLayer(
|
|
||||||
src: e.emote![index].url!,
|
|
||||||
width: size * 38,
|
|
||||||
height: size * 38,
|
|
||||||
semanticsLabel:
|
|
||||||
e.emote![index].text!,
|
|
||||||
type: 'emote',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
).toList(),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Divider(
|
|
||||||
height: 1,
|
|
||||||
color: Theme.of(context).dividerColor.withOpacity(0.1),
|
|
||||||
),
|
|
||||||
TabBar(
|
|
||||||
controller: _emotePanelController.tabController,
|
|
||||||
dividerColor: Colors.transparent,
|
|
||||||
isScrollable: true,
|
|
||||||
tabs: _emotePanelController.emotePackage
|
|
||||||
.map(
|
|
||||||
(e) => Padding(
|
|
||||||
padding: const EdgeInsets.all(8),
|
|
||||||
child: NetworkImgLayer(
|
|
||||||
width: 24,
|
|
||||||
height: 24,
|
|
||||||
type: 'emote',
|
|
||||||
src: e.url,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
)
|
itemCount: e.emote!.length,
|
||||||
.toList(),
|
itemBuilder: (context, index) {
|
||||||
),
|
return Material(
|
||||||
SizedBox(height: MediaQuery.of(context).padding.bottom),
|
color: Colors.transparent,
|
||||||
],
|
child: InkWell(
|
||||||
);
|
borderRadius: BorderRadius.circular(8),
|
||||||
} else {
|
onTap: () {
|
||||||
return Center(child: Text(data['msg']));
|
widget.onChoose(e, e.emote![index]);
|
||||||
}
|
},
|
||||||
} else {
|
child: Padding(
|
||||||
return const Center(child: Text('加载中...'));
|
padding: const EdgeInsets.all(6),
|
||||||
}
|
child: type == 4
|
||||||
});
|
? Center(
|
||||||
|
child: Text(
|
||||||
|
e.emote![index].text!,
|
||||||
|
overflow: TextOverflow.clip,
|
||||||
|
maxLines: 1,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: NetworkImgLayer(
|
||||||
|
src: e.emote![index].url!,
|
||||||
|
width: size * 38,
|
||||||
|
height: size * 38,
|
||||||
|
semanticsLabel: e.emote![index].text!,
|
||||||
|
type: 'emote',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
).toList(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Divider(
|
||||||
|
height: 1,
|
||||||
|
color: Theme.of(context).dividerColor.withOpacity(0.1),
|
||||||
|
),
|
||||||
|
TabBar(
|
||||||
|
controller: _emotePanelController.tabController,
|
||||||
|
dividerColor: Colors.transparent,
|
||||||
|
isScrollable: true,
|
||||||
|
tabs: (loadingState.response as List<Packages>)
|
||||||
|
.map(
|
||||||
|
(e) => Padding(
|
||||||
|
padding: const EdgeInsets.all(8),
|
||||||
|
child: NetworkImgLayer(
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
type: 'emote',
|
||||||
|
src: e.url,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.toList(),
|
||||||
|
),
|
||||||
|
SizedBox(height: MediaQuery.of(context).padding.bottom),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
: loadingState is Error
|
||||||
|
? Center(child: Text(loadingState.errMsg))
|
||||||
|
: const Center(child: Text('加载中...'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class FansController extends GetxController {
|
|||||||
RxList<FansItemModel> fansList = <FansItemModel>[].obs;
|
RxList<FansItemModel> fansList = <FansItemModel>[].obs;
|
||||||
late int? mid;
|
late int? mid;
|
||||||
late String? name;
|
late String? name;
|
||||||
var userInfo;
|
dynamic userInfo;
|
||||||
RxString loadingText = '加载中...'.obs;
|
RxString loadingText = '加载中...'.obs;
|
||||||
RxBool isOwner = false.obs;
|
RxBool isOwner = false.obs;
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class FollowController extends GetxController with GetTickerProviderStateMixin {
|
|||||||
RxList<FollowItemModel> followList = <FollowItemModel>[].obs;
|
RxList<FollowItemModel> followList = <FollowItemModel>[].obs;
|
||||||
late int? mid;
|
late int? mid;
|
||||||
late String? name;
|
late String? name;
|
||||||
var userInfo;
|
dynamic userInfo;
|
||||||
RxString loadingText = '加载中...'.obs;
|
RxString loadingText = '加载中...'.obs;
|
||||||
RxBool isOwner = false.obs;
|
RxBool isOwner = false.obs;
|
||||||
late List<MemberTagItemModel> followTags;
|
late List<MemberTagItemModel> followTags;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
|
|||||||
Box settingStorage = GStorage.setting;
|
Box settingStorage = GStorage.setting;
|
||||||
RxBool userLogin = false.obs;
|
RxBool userLogin = false.obs;
|
||||||
RxString userFace = ''.obs;
|
RxString userFace = ''.obs;
|
||||||
var userInfo;
|
dynamic userInfo;
|
||||||
Box setting = GStorage.setting;
|
Box setting = GStorage.setting;
|
||||||
late final StreamController<bool> searchBarStream =
|
late final StreamController<bool> searchBarStream =
|
||||||
StreamController<bool>.broadcast();
|
StreamController<bool>.broadcast();
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class HomeAppBar extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var userInfo = userInfoCache.get('userInfoCache');
|
dynamic userInfo = userInfoCache.get('userInfoCache');
|
||||||
return SliverAppBar(
|
return SliverAppBar(
|
||||||
// forceElevated: true,
|
// forceElevated: true,
|
||||||
scrolledUnderElevation: 0,
|
scrolledUnderElevation: 0,
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class MainController extends GetxController {
|
|||||||
setting.get(SettingBoxKey.defaultHomePage, defaultValue: 0) as int;
|
setting.get(SettingBoxKey.defaultHomePage, defaultValue: 0) as int;
|
||||||
selectedIndex = defaultNavigationBars
|
selectedIndex = defaultNavigationBars
|
||||||
.indexWhere((item) => item['id'] == defaultHomePage);
|
.indexWhere((item) => item['id'] == defaultHomePage);
|
||||||
var userInfo = userInfoCache.get('userInfoCache');
|
dynamic userInfo = userInfoCache.get('userInfoCache');
|
||||||
userLogin.value = userInfo != null;
|
userLogin.value = userInfo != null;
|
||||||
dynamicBadgeType = DynamicBadgeMode.values[setting.get(
|
dynamicBadgeType = DynamicBadgeMode.values[setting.get(
|
||||||
SettingBoxKey.dynamicBadgeMode,
|
SettingBoxKey.dynamicBadgeMode,
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ class MediaController extends GetxController {
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
var userInfo;
|
dynamic userInfo;
|
||||||
int? mid;
|
int? mid;
|
||||||
final ScrollController scrollController = ScrollController();
|
final ScrollController scrollController = ScrollController();
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class SettingController extends GetxController {
|
|||||||
RxDouble toastOpacity = (1.0).obs;
|
RxDouble toastOpacity = (1.0).obs;
|
||||||
RxInt picQuality = 10.obs;
|
RxInt picQuality = 10.obs;
|
||||||
Rx<ThemeType> themeType = ThemeType.system.obs;
|
Rx<ThemeType> themeType = ThemeType.system.obs;
|
||||||
var userInfo;
|
dynamic userInfo;
|
||||||
Rx<DynamicBadgeMode> dynamicBadgeType = DynamicBadgeMode.number.obs;
|
Rx<DynamicBadgeMode> dynamicBadgeType = DynamicBadgeMode.number.obs;
|
||||||
RxInt defaultHomePage = 0.obs;
|
RxInt defaultHomePage = 0.obs;
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class VideoDetailController extends GetxController
|
|||||||
double? brightness;
|
double? brightness;
|
||||||
// 默认记录历史记录
|
// 默认记录历史记录
|
||||||
bool enableHeart = true;
|
bool enableHeart = true;
|
||||||
var userInfo;
|
dynamic userInfo;
|
||||||
late bool isFirstTime = true;
|
late bool isFirstTime = true;
|
||||||
Floating? floating;
|
Floating? floating;
|
||||||
late PreferredSizeWidget headerControl;
|
late PreferredSizeWidget headerControl;
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ class VideoIntroController extends GetxController {
|
|||||||
RxMap followStatus = {}.obs;
|
RxMap followStatus = {}.obs;
|
||||||
|
|
||||||
RxInt lastPlayCid = 0.obs;
|
RxInt lastPlayCid = 0.obs;
|
||||||
var userInfo;
|
dynamic userInfo;
|
||||||
|
|
||||||
// 同时观看
|
// 同时观看
|
||||||
bool isShowOnlineTotal = false;
|
bool isShowOnlineTotal = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user