opt: pages

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-04-18 11:24:46 +08:00
parent a252ee0655
commit f42a6200ed
22 changed files with 87 additions and 164 deletions

View File

@@ -35,6 +35,17 @@ class _AboutPageState extends State<AboutPage> {
late int _pressCount = 0;
late Color outline;
late TextStyle subTitleStyle;
@override
void didChangeDependencies() {
super.didChangeDependencies();
outline = Theme.of(context).colorScheme.outline;
subTitleStyle =
TextStyle(fontSize: 13, color: Theme.of(context).colorScheme.outline);
}
@override
void initState() {
super.initState();
@@ -49,9 +60,6 @@ class _AboutPageState extends State<AboutPage> {
@override
Widget build(BuildContext context) {
final Color outline = Theme.of(context).colorScheme.outline;
TextStyle subTitleStyle =
TextStyle(fontSize: 13, color: Theme.of(context).colorScheme.outline);
return Scaffold(
appBar:
widget.showAppBar == false ? null : AppBar(title: const Text('关于')),
@@ -90,27 +98,27 @@ class _AboutPageState extends State<AboutPage> {
),
),
ListTile(
title: Text('PiliPlus',
textAlign: TextAlign.center,
style: Theme.of(context)
.textTheme
.titleMedium!
.copyWith(height: 2)),
subtitle: Row(children: [
const Spacer(),
Text(
'使用Flutter开发的B站第三方客户端',
textAlign: TextAlign.center,
style: TextStyle(color: Theme.of(context).colorScheme.outline),
semanticsLabel: '与你一起,发现不一样的世界',
),
const Icon(
Icons.accessibility_new,
semanticLabel: "无障碍适配",
size: 18,
),
const Spacer(),
]),
title: Text(
'PiliPlus',
textAlign: TextAlign.center,
style:
Theme.of(context).textTheme.titleMedium!.copyWith(height: 2),
),
subtitle: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'使用Flutter开发的B站第三方客户端',
style: TextStyle(color: outline),
semanticsLabel: '与你一起,发现不一样的世界',
),
const Icon(
Icons.accessibility_new,
semanticLabel: "无障碍适配",
size: 18,
),
],
),
),
Obx(
() => ListTile(
@@ -137,29 +145,6 @@ Commit Hash: ${BuildConfig.commitHash}''',
'https://github.com/bggRGjQaUbCoE/PiliPlus/commit/${BuildConfig.commitHash}'),
onLongPress: () => Utils.copyText(BuildConfig.commitHash),
),
// Obx(
// () => ListTile(
// onTap: () => _aboutController.onUpdate(),
// title: const Text('最新版本'),
// leading: const Icon(Icons.flag_outlined),
// trailing: Text(
// _aboutController.isLoading.value
// ? '正在获取'
// : _aboutController.isUpdate.value
// ? '有新版本 ❤️${_aboutController.remoteVersion.value}'
// : '当前已是最新版',
// style: subTitleStyle,
// ),
// ),
// ),
// ListTile(
// onTap: () {},
// title: const Text('更新日志'),
// trailing: const Icon(
// Icons.arrow_forward,
// size: 16,
// ),
// ),
Divider(
thickness: 1,
height: 30,
@@ -303,10 +288,7 @@ Commit Hash: ${BuildConfig.commitHash}''',
onPressed: Get.back,
child: Text(
'取消',
style: TextStyle(
color:
Theme.of(context).colorScheme.outline,
),
style: TextStyle(color: outline),
),
),
TextButton(
@@ -391,11 +373,7 @@ Commit Hash: ${BuildConfig.commitHash}''',
onPressed: Get.back,
child: Text(
'取消',
style: TextStyle(
color: Theme.of(context)
.colorScheme
.outline,
),
style: TextStyle(color: outline),
),
),
TextButton(
@@ -425,8 +403,8 @@ Commit Hash: ${BuildConfig.commitHash}''',
ListTile(
title: const Text('重置所有设置'),
leading: const Icon(Icons.settings_backup_restore_outlined),
onTap: () async {
await showDialog(
onTap: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
@@ -490,47 +468,13 @@ class AboutController extends GetxController {
@override
void onInit() {
super.onInit();
// init();
// 获取当前版本
getCurrentApp();
// 获取最新的版本
// getRemoteApp();
}
// 获取设备信息
// Future init() async {
// DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
// if (Platform.isAndroid) {
// AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
// debugPrint(androidInfo.supportedAbis);
// } else if (Platform.isIOS) {
// IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
// debugPrint(iosInfo);
// }
// }
// 获取当前版本
Future getCurrentApp() async {
var currentInfo = await PackageInfo.fromPlatform();
String buildNumber = currentInfo.buildNumber;
currentVersion.value = "${currentInfo.version}+$buildNumber";
}
// // 获取远程版本
// Future getRemoteApp() async {
// var result = await Request().get(Api.latestApp, extra: {'ua': 'pc'});
// if (result.data.isEmpty) {
// SmartDialog.showToast('检查更新失败github接口未返回数据请检查网络');
// return false;
// } else if (result.data[0] == null) {
// SmartDialog.showToast('检查更新失败github接口返回如下内容\n${result.data}');
// return false;
// }
// data = LatestDataModel.fromJson(result.data[0]);
// remoteAppInfo = data;
// remoteVersion.value = data!.tagName!;
// isUpdate.value =
// Utils.needUpdate(currentVersion.value, remoteVersion.value);
// isLoading.value = false;
// }
}

View File

@@ -14,8 +14,8 @@ class BangumiController extends CommonListController<
BangumiController({required this.tabType});
final TabType tabType;
RxBool isLogin = false.obs;
int? mid;
late final RxBool isLogin;
late final showPgcTimeline =
tabType == TabType.bangumi && GStorage.showPgcTimeline;
@@ -23,7 +23,7 @@ class BangumiController extends CommonListController<
void onInit() {
super.onInit();
mid = Accounts.main.mid;
isLogin.value = mid != 0;
isLogin = (mid != 0).obs;
queryData();
queryBangumiFollow();

View File

@@ -11,7 +11,7 @@ import 'package:get/get.dart';
class BlackListController
extends CommonListController<BlackListDataModel, BlackListItem> {
int pageSize = 50;
RxInt total = 0.obs;
RxInt total = (-1).obs;
@override
void onInit() {

View File

@@ -34,7 +34,8 @@ class _BlackListPageState extends State<BlackListPage> {
return Scaffold(
appBar: AppBar(
title: Obx(
() => Text('黑名单管理: ${_blackListController.total.value}'),
() => Text(
'黑名单管理${_blackListController.total.value == -1 ? '' : ': ${_blackListController.total.value}'}'),
),
),
body: refreshIndicator(

View File

@@ -5,7 +5,7 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
class DanmakuBlockController extends GetxController
with GetTickerProviderStateMixin {
with GetSingleTickerProviderStateMixin {
final ruleTypes = RxMap<int, Map<int, String>>({0: {}, 1: {}, 2: {}});
late TabController tabController;

View File

@@ -16,7 +16,7 @@ import '../../models/follow/result.dart';
import '../common/common_controller.dart';
class DynamicsController extends GetxController
with GetTickerProviderStateMixin, ScrollOrRefreshMixin {
with GetSingleTickerProviderStateMixin, ScrollOrRefreshMixin {
@override
final ScrollController scrollController = ScrollController();
String? offset = '';

View File

@@ -8,7 +8,7 @@ import '../../http/reply.dart';
class EmotePanelController
extends CommonListController<List<Packages>?, Packages>
with GetTickerProviderStateMixin {
with GetSingleTickerProviderStateMixin {
TabController? tabController;
@override

View File

@@ -9,7 +9,8 @@ import 'package:PiliPlus/utils/storage.dart';
/// 查看自己的关注时,可以查看分类
/// 查看其他人的关注时,只可以看全部
class FollowController extends GetxController with GetTickerProviderStateMixin {
class FollowController extends GetxController
with GetSingleTickerProviderStateMixin {
int pn = 1;
int ps = 20;
int total = 0;

View File

@@ -10,7 +10,7 @@ import 'package:PiliPlus/models/user/history.dart';
import 'package:PiliPlus/utils/storage.dart';
class HistoryController extends MultiSelectController<HistoryData, HisListItem>
with GetTickerProviderStateMixin {
with GetSingleTickerProviderStateMixin {
HistoryController(this.type);
late final baseCtr = Get.put(HistoryBaseController());

View File

@@ -11,18 +11,16 @@ import '../common/common_controller.dart';
import '../mine/view.dart';
class HomeController extends GetxController
with GetTickerProviderStateMixin, ScrollOrRefreshMixin {
late RxList tabs = [].obs;
late TabController tabController;
with GetSingleTickerProviderStateMixin, ScrollOrRefreshMixin {
late List tabs;
late List tabsCtrList;
late List<Widget> tabsPageList;
late TabController tabController;
RxBool isLogin = false.obs;
RxString userFace = ''.obs;
dynamic userInfo;
StreamController<bool>? searchBarStream;
late bool hideSearchBar;
late List defaultTabs;
late List<String> tabbarSort;
late bool useSideBar;
late bool enableSearchWord;
@@ -45,23 +43,26 @@ class HomeController extends GetxController
@override
void onInit() {
super.onInit();
userInfo = GStorage.userInfo.get('userInfoCache');
final userInfo = GStorage.userInfo.get('userInfoCache');
isLogin.value = userInfo != null;
userFace.value = userInfo != null ? userInfo.face : '';
hideSearchBar =
GStorage.setting.get(SettingBoxKey.hideSearchBar, defaultValue: true);
if (hideSearchBar) {
searchBarStream = StreamController<bool>.broadcast();
}
enableSearchWord = GStorage.setting
.get(SettingBoxKey.enableSearchWord, defaultValue: true);
if (enableSearchWord) {
lateCheckSearchAt = DateTime.now().millisecondsSinceEpoch;
querySearchDefault();
}
useSideBar =
GStorage.setting.get(SettingBoxKey.useSideBar, defaultValue: false);
// 进行tabs配置
setTabConfig();
}
@@ -71,18 +72,17 @@ class HomeController extends GetxController
}
void setTabConfig() async {
defaultTabs = [...tabsConfig];
tabbarSort = GStorage.tabbarSort;
final defaultTabs = [...tabsConfig];
final tabbarSort = GStorage.tabbarSort;
defaultTabs.retainWhere(
(item) => tabbarSort.contains((item['type'] as TabType).name));
defaultTabs.sort((a, b) => tabbarSort
.indexOf((a['type'] as TabType).name)
.compareTo(tabbarSort.indexOf((b['type'] as TabType).name)));
tabs.value = defaultTabs;
tabs = defaultTabs;
tabsCtrList = tabs.map((e) => e['ctr']).toList();
tabsPageList = tabs.map<Widget>((e) => e['page']).toList();
tabController = TabController(
initialIndex: max(0, tabbarSort.indexOf(TabType.rcmd.name)),

View File

@@ -67,7 +67,8 @@ class _HomePageState extends State<HomePage>
Expanded(
child: tabBarView(
controller: _homeController.tabController,
children: _homeController.tabsPageList,
children:
_homeController.tabs.map<Widget>((e) => e['page']).toList(),
),
),
],

View File

@@ -5,6 +5,7 @@ import 'package:PiliPlus/models/common/tab_type.dart';
import 'package:PiliPlus/models/model_hot_video_item.dart';
import 'package:PiliPlus/pages/common/common_page.dart';
import 'package:PiliPlus/pages/rank/view.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:PiliPlus/common/constants.dart';
@@ -41,7 +42,7 @@ class _HotPageState extends CommonPageState<HotPage, HotController>
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Image.network(width: 35, height: 35, iconUrl),
CachedNetworkImage(width: 35, height: 35, imageUrl: iconUrl),
const SizedBox(height: 4),
Text(
title,

View File

@@ -7,7 +7,7 @@ import 'package:get/get.dart';
class LiveEmotePanelController
extends CommonListController<List<LiveEmoteDatum>?, LiveEmoteDatum>
with GetTickerProviderStateMixin {
with GetSingleTickerProviderStateMixin {
LiveEmotePanelController(this.roomId);
final int roomId;
TabController? tabController;

View File

@@ -11,7 +11,7 @@ import 'package:get/get.dart';
import '../../../../models/space/item.dart';
class MemberContributeCtr extends CommonDataController
with GetTickerProviderStateMixin {
with GetSingleTickerProviderStateMixin {
MemberContributeCtr({
required this.heroTag,
required this.initialIndex,

View File

@@ -108,6 +108,7 @@ class MemberControllerNew extends CommonDataController<Data, dynamic>
});
}
tabs = tab2!.map((item) => Tab(text: item.title ?? '')).toList();
tabController?.dispose();
tabController = TabController(
vsync: this,
length: tabs.length,
@@ -132,6 +133,7 @@ class MemberControllerNew extends CommonDataController<Data, dynamic>
Tab2(title: '追番', param: 'bangumi'),
];
tabs = tab2!.map((item) => Tab(text: item.title)).toList();
tabController?.dispose();
tabController = TabController(
vsync: this,
length: tabs.length,

View File

@@ -7,41 +7,19 @@ import 'package:get/get.dart';
import 'package:PiliPlus/models/common/rank_type.dart';
class RankController extends GetxController
with GetTickerProviderStateMixin, ScrollOrRefreshMixin {
bool flag = false;
late RxList tabs = [].obs;
RxInt initialIndex = 0.obs;
with GetSingleTickerProviderStateMixin, ScrollOrRefreshMixin {
RxInt tabIndex = 0.obs;
late TabController tabController;
late List<Widget> tabsPageList;
// late final StreamController<bool> searchBarStream =
// StreamController<bool>.broadcast();
late bool enableGradientBg;
ZoneController get controller => Get.find<ZoneController>(
tag: tabsConfig[tabController.index]['rid'].toString());
@override
ScrollController get scrollController => controller.scrollController;
@override
void onInit() {
super.onInit();
// enableGradientBg =
// setting.get(SettingBoxKey.enableGradientBg, defaultValue: true);
// 进行tabs配置
setTabConfig();
}
void setTabConfig() async {
tabs.value = tabsConfig;
initialIndex.value = 0;
tabsPageList = tabs.map((item) => ZonePage(rid: item['rid'])).toList();
tabController = TabController(
initialIndex: initialIndex.value,
length: tabs.length,
vsync: this,
);
tabController = TabController(length: tabsConfig.length, vsync: this);
}
@override

View File

@@ -1,3 +1,5 @@
import 'package:PiliPlus/models/common/rank_type.dart';
import 'package:PiliPlus/pages/rank/zone/view.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import './controller.dart';
@@ -10,19 +12,12 @@ class RankPage extends StatefulWidget {
}
class _RankPageState extends State<RankPage>
with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin {
with AutomaticKeepAliveClientMixin {
final RankController _rankController = Get.put(RankController());
@override
bool get wantKeepAlive => true;
@override
void initState() {
super.initState();
_rankController.tabController =
TabController(vsync: this, length: _rankController.tabs.length);
}
@override
Widget build(BuildContext context) {
super.build(context);
@@ -36,16 +31,16 @@ class _RankPageState extends State<RankPage>
),
child: Column(
children: List.generate(
_rankController.tabs.length,
tabsConfig.length,
(index) => Obx(
() => IntrinsicHeight(
child: InkWell(
onTap: () {
_rankController.initialIndex.value = index;
_rankController.tabIndex.value = index;
_rankController.tabController.animateTo(index);
},
child: ColoredBox(
color: index == _rankController.initialIndex.value
color: index == _rankController.tabIndex.value
? Theme.of(context).colorScheme.onInverseSurface
: Theme.of(context).colorScheme.surface,
child: Row(
@@ -54,7 +49,7 @@ class _RankPageState extends State<RankPage>
Container(
height: double.infinity,
width: 3,
color: index == _rankController.initialIndex.value
color: index == _rankController.tabIndex.value
? Theme.of(context).colorScheme.primary
: Colors.transparent,
),
@@ -65,10 +60,10 @@ class _RankPageState extends State<RankPage>
padding:
const EdgeInsets.symmetric(vertical: 7),
child: Text(
_rankController.tabs[index]['label'],
tabsConfig[index]['label'],
style: TextStyle(
color: index ==
_rankController.initialIndex.value
_rankController.tabIndex.value
? Theme.of(context).colorScheme.primary
: Theme.of(context)
.colorScheme
@@ -94,7 +89,8 @@ class _RankPageState extends State<RankPage>
child: TabBarView(
physics: const NeverScrollableScrollPhysics(),
controller: _rankController.tabController,
children: _rankController.tabsPageList,
children:
tabsConfig.map((item) => ZonePage(rid: item['rid'])).toList(),
),
),
],

View File

@@ -43,7 +43,6 @@ class _ZonePageState extends CommonPageState<ZonePage, ZoneController>
controller: controller.scrollController,
slivers: [
SliverPadding(
// 单列布局 EdgeInsets.zero
padding: EdgeInsets.only(
top: StyleString.safeSpace - 5,
bottom: MediaQuery.of(context).padding.bottom + 80,

View File

@@ -32,8 +32,7 @@ import '../../../../http/search.dart';
import '../../../../models/model_hot_video_item.dart';
import '../related/index.dart';
class VideoIntroController extends GetxController
with GetTickerProviderStateMixin {
class VideoIntroController extends GetxController {
// 视频bvid
late String bvid;

View File

@@ -41,7 +41,8 @@ class ActionItem extends StatefulWidget {
State<ActionItem> createState() => ActionItemState();
}
class ActionItemState extends State<ActionItem> with TickerProviderStateMixin {
class ActionItemState extends State<ActionItem>
with SingleTickerProviderStateMixin {
AnimationController? controller;
Animation<double>? _animation;

View File

@@ -8,7 +8,7 @@ import 'package:flutter/material.dart';
import 'package:get/get_state_manager/src/rx_flutter/rx_ticket_provider_mixin.dart';
class VideoReplyController extends ReplyController<MainListReply>
with GetTickerProviderStateMixin {
with GetSingleTickerProviderStateMixin {
VideoReplyController({required this.aid});
// 视频aid 请求时使用的oid
int aid;

View File

@@ -10,7 +10,7 @@ import 'package:PiliPlus/models/common/reply_type.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
class VideoReplyReplyController extends ReplyController
with GetTickerProviderStateMixin {
with GetSingleTickerProviderStateMixin {
VideoReplyReplyController({
required this.hasRoot,
required this.id,