merge mine & media

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-07-28 14:27:18 +08:00
parent 6ca7efe8d1
commit 65b432ed2c
40 changed files with 903 additions and 1038 deletions

View File

@@ -8,11 +8,15 @@ import 'package:PiliPlus/models/common/msg/msg_unread_type.dart';
import 'package:PiliPlus/models/common/nav_bar_config.dart';
import 'package:PiliPlus/models_new/msgfeed_unread/data.dart';
import 'package:PiliPlus/models_new/single_unread/data.dart';
import 'package:PiliPlus/pages/dynamics/controller.dart';
import 'package:PiliPlus/pages/home/controller.dart';
import 'package:PiliPlus/services/account_service.dart';
import 'package:PiliPlus/utils/feed_back.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/update.dart';
import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@@ -21,20 +25,27 @@ class MainController extends GetxController
AccountService accountService = Get.find<AccountService>();
List<NavigationBarType> navigationBars = <NavigationBarType>[];
RxInt dynCount = 0.obs;
StreamController<bool>? bottomBarStream;
late bool hideTabBar = Pref.hideTabBar;
late dynamic controller;
RxInt selectedIndex = 0.obs;
RxInt dynCount = 0.obs;
late DynamicBadgeMode dynamicBadgeMode;
late bool checkDynamic = Pref.checkDynamic;
late int dynamicPeriod = Pref.dynamicPeriod;
late int dynamicPeriod = Pref.dynamicPeriod * 60 * 1000;
late int _lastCheckDynamicAt = 0;
late int dynIndex = -1;
late final DynamicsController dynamicController = Get.put(
DynamicsController(),
);
late int homeIndex = -1;
late final HomeController? homeController = homeIndex == -1
? null
: Get.put(HomeController());
late DynamicBadgeMode msgBadgeMode = Pref.msgBadgeMode;
late Set<MsgUnReadType> msgUnReadTypes = Pref.msgUnReadTypeV2;
late final RxString msgUnReadCount = ''.obs;
@@ -48,6 +59,9 @@ class MainController extends GetxController
late bool directExitOnBack = Pref.directExitOnBack;
static const _period = 5 * 60 * 1000;
late int _lastSelectTime = 0;
@override
void onInit() {
super.onInit();
@@ -163,19 +177,19 @@ class MainController extends GetxController
}
}
Future<void> getUnreadDynamic() async {
void getUnreadDynamic() {
if (!accountService.isLogin.value || dynIndex == -1) {
return;
}
DynGrpc.dynRed().then((res) {
if (res != null) {
setCount(res);
setDynCount(res);
}
});
}
Future<void> setCount([int count = 0]) async {
if (dynIndex == -1 || dynCount.value == count) return;
void setDynCount([int count = 0]) {
if (dynIndex == -1) return;
dynCount.value = count;
}
@@ -187,7 +201,7 @@ class MainController extends GetxController
return;
}
int now = DateTime.now().millisecondsSinceEpoch;
if (now - _lastCheckDynamicAt >= dynamicPeriod * 60 * 1000) {
if (now - _lastCheckDynamicAt >= dynamicPeriod) {
_lastCheckDynamicAt = now;
getUnreadDynamic();
}
@@ -198,7 +212,7 @@ class MainController extends GetxController
(GStorage.setting.get(SettingBoxKey.navBarSort) as List?)?.cast();
int defaultHomePage = Pref.defaultHomePage;
late final List<NavigationBarType> navigationBars;
if (navBarSort == null) {
if (navBarSort == null || navBarSort.isEmpty) {
navigationBars = NavigationBarType.values;
} else {
navigationBars = navBarSort
@@ -212,6 +226,86 @@ class MainController extends GetxController
);
}
void checkDefaultSearch([bool shouldCheck = false]) {
if (homeController?.enableSearchWord == true) {
if (shouldCheck &&
navigationBars[selectedIndex.value] != NavigationBarType.home) {
return;
}
int now = DateTime.now().millisecondsSinceEpoch;
if (now - homeController!.lateCheckSearchAt >= _period) {
homeController!
..lateCheckSearchAt = now
..querySearchDefault();
}
}
}
void checkUnread([bool shouldCheck = false]) {
if (accountService.isLogin.value &&
homeIndex != -1 &&
msgBadgeMode != DynamicBadgeMode.hidden) {
if (shouldCheck &&
navigationBars[selectedIndex.value] != NavigationBarType.home) {
return;
}
int now = DateTime.now().millisecondsSinceEpoch;
if (now - lastCheckUnreadAt >= _period) {
lastCheckUnreadAt = now;
queryUnreadMsg();
}
}
}
void toMinePage() {
final index = navigationBars.indexOf(NavigationBarType.mine);
if (index != -1) {
setIndex(index);
}
}
void setIndex(int value) {
feedBack();
final currentNav = navigationBars[value];
if (value != selectedIndex.value) {
selectedIndex.value = value;
if (mainTabBarView) {
controller.animateTo(value);
} else {
controller.jumpToPage(value);
}
if (currentNav == NavigationBarType.home) {
checkDefaultSearch();
checkUnread();
} else if (currentNav == NavigationBarType.dynamics) {
setDynCount();
}
} else {
int now = DateTime.now().millisecondsSinceEpoch;
if (now - _lastSelectTime < 500) {
EasyThrottle.throttle(
'topOrRefresh',
const Duration(milliseconds: 500),
() {
if (currentNav == NavigationBarType.home) {
homeController!.onRefresh();
} else if (currentNav == NavigationBarType.dynamics) {
dynamicController.onRefresh();
}
},
);
} else {
if (currentNav == NavigationBarType.home) {
homeController!.toTopOrRefresh();
} else if (currentNav == NavigationBarType.dynamics) {
dynamicController.toTopOrRefresh();
}
}
_lastSelectTime = now;
}
}
@override
void onClose() {
bottomBarStream?.close();

View File

@@ -5,18 +5,13 @@ import 'package:PiliPlus/common/widgets/tabs.dart';
import 'package:PiliPlus/models/common/dynamic/dynamic_badge_mode.dart';
import 'package:PiliPlus/models/common/image_type.dart';
import 'package:PiliPlus/models/common/nav_bar_config.dart';
import 'package:PiliPlus/pages/dynamics/controller.dart';
import 'package:PiliPlus/pages/dynamics/view.dart';
import 'package:PiliPlus/pages/home/controller.dart';
import 'package:PiliPlus/pages/home/view.dart';
import 'package:PiliPlus/pages/main/controller.dart';
import 'package:PiliPlus/pages/mine/controller.dart';
import 'package:PiliPlus/utils/app_scheme.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/feed_back.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
@@ -36,11 +31,6 @@ class MainApp extends StatefulWidget {
class _MainAppState extends State<MainApp>
with RouteAware, WidgetsBindingObserver {
final MainController _mainController = Get.put(MainController());
late final _homeController = Get.put(HomeController());
late final _dynamicController = Get.put(DynamicsController());
static const _period = 5 * 60 * 1000;
late int _lastSelectTime = 0;
@override
void initState() {
@@ -57,9 +47,10 @@ class _MainAppState extends State<MainApp>
@override
void didPopNext() {
WidgetsBinding.instance.addObserver(this);
_mainController.checkUnreadDynamic();
_checkDefaultSearch(true);
_checkUnread(context.orientation == Orientation.portrait);
_mainController
..checkUnreadDynamic()
..checkDefaultSearch(true)
..checkUnread(context.orientation == Orientation.portrait);
super.didPopNext();
}
@@ -72,85 +63,10 @@ class _MainAppState extends State<MainApp>
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
_mainController.checkUnreadDynamic();
_checkDefaultSearch(true);
_checkUnread(context.orientation == Orientation.portrait);
}
}
void _checkDefaultSearch([bool shouldCheck = false]) {
if (_mainController.homeIndex != -1 && _homeController.enableSearchWord) {
if (shouldCheck &&
_mainController.navigationBars[_mainController.selectedIndex.value] !=
NavigationBarType.home) {
return;
}
int now = DateTime.now().millisecondsSinceEpoch;
if (now - _homeController.lateCheckSearchAt >= _period) {
_homeController
..lateCheckSearchAt = now
..querySearchDefault();
}
}
}
void _checkUnread([bool shouldCheck = false]) {
if (_mainController.accountService.isLogin.value &&
_mainController.homeIndex != -1 &&
_mainController.msgBadgeMode != DynamicBadgeMode.hidden) {
if (shouldCheck &&
_mainController.navigationBars[_mainController.selectedIndex.value] !=
NavigationBarType.home) {
return;
}
int now = DateTime.now().millisecondsSinceEpoch;
if (now - _mainController.lastCheckUnreadAt >= _period) {
_mainController
..lastCheckUnreadAt = now
..queryUnreadMsg();
}
}
}
void setIndex(int value) {
feedBack();
final currentPage = _mainController.navigationBars[value].page;
if (value != _mainController.selectedIndex.value) {
_mainController.selectedIndex.value = value;
if (_mainController.mainTabBarView) {
_mainController.controller.animateTo(value);
} else {
_mainController.controller.jumpToPage(value);
}
if (currentPage is HomePage) {
_checkDefaultSearch();
_checkUnread();
} else if (currentPage is DynamicsPage) {
_mainController.setCount();
}
} else {
int now = DateTime.now().millisecondsSinceEpoch;
if (now - _lastSelectTime < 500) {
EasyThrottle.throttle(
'topOrRefresh',
const Duration(milliseconds: 500),
() {
if (currentPage is HomePage) {
_homeController.onRefresh();
} else if (currentPage is DynamicsPage) {
_dynamicController.onRefresh();
}
},
);
} else {
if (currentPage is HomePage) {
_homeController.toTopOrRefresh();
} else if (currentPage is DynamicsPage) {
_dynamicController.toTopOrRefresh();
}
}
_lastSelectTime = now;
_mainController
..checkUnreadDynamic()
..checkDefaultSearch(true)
..checkUnread(context.orientation == Orientation.portrait);
}
}
@@ -182,9 +98,10 @@ class _MainAppState extends State<MainApp>
onBack();
} else {
if (_mainController.selectedIndex.value != 0) {
setIndex(0);
_mainController.bottomBarStream?.add(true);
_homeController.searchBarStream?.add(true);
_mainController
..setIndex(0)
..bottomBarStream?.add(true)
..homeController?.searchBarStream?.add(true);
} else {
onBack();
}
@@ -229,7 +146,8 @@ class _MainAppState extends State<MainApp>
Radius.circular(16),
),
),
onDestinationSelected: setIndex,
onDestinationSelected:
_mainController.setIndex,
selectedIndex: _mainController
.selectedIndex
.value,
@@ -258,7 +176,8 @@ class _MainAppState extends State<MainApp>
groupAlignment: 0.5,
selectedIndex:
_mainController.selectedIndex.value,
onDestinationSelected: setIndex,
onDestinationSelected:
_mainController.setIndex,
labelType: NavigationRailLabelType.selected,
leading: userAndSearchVertical(theme),
destinations: _mainController.navigationBars
@@ -329,7 +248,8 @@ class _MainAppState extends State<MainApp>
? _mainController.navigationBars.length > 1
? Obx(
() => NavigationBar(
onDestinationSelected: setIndex,
onDestinationSelected:
_mainController.setIndex,
selectedIndex:
_mainController.selectedIndex.value,
destinations: _mainController
@@ -353,7 +273,7 @@ class _MainAppState extends State<MainApp>
() => BottomNavigationBar(
currentIndex:
_mainController.selectedIndex.value,
onTap: setIndex,
onTap: _mainController.setIndex,
iconSize: 16,
selectedFontSize: 12,
unselectedFontSize: 12,
@@ -424,8 +344,7 @@ class _MainAppState extends State<MainApp>
child: Material(
type: MaterialType.transparency,
child: InkWell(
onTap: () =>
_homeController.showUserInfoDialog(context),
onTap: _mainController.toMinePage,
splashColor: theme.colorScheme.primaryContainer
.withValues(alpha: 0.3),
customBorder: const CircleBorder(),
@@ -461,8 +380,7 @@ class _MainAppState extends State<MainApp>
)
: defaultUser(
theme: theme,
onPressed: () =>
_homeController.showUserInfoDialog(context),
onPressed: _mainController.toMinePage,
),
),
),