From 2b0dc9d28503a4b1cda138006b1272a430a4ace9 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sat, 19 Aug 2023 15:25:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=99=BB=E5=BD=95/=E9=80=80=E5=87=BA?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=A1=B5=E9=9D=A2=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/dynamics/controller.dart | 13 +++ lib/pages/dynamics/view.dart | 145 +++++++++++++++++------------ lib/pages/main/view.dart | 2 + lib/pages/media/view.dart | 10 +- lib/pages/mine/controller.dart | 3 - lib/pages/mine/view.dart | 30 +++++- lib/pages/setting/controller.dart | 20 +++- lib/pages/webview/controller.dart | 11 +-- lib/utils/event_bus.dart | 53 +++++++++++ 9 files changed, 206 insertions(+), 81 deletions(-) create mode 100644 lib/utils/event_bus.dart diff --git a/lib/pages/dynamics/controller.dart b/lib/pages/dynamics/controller.dart index c479ff0a..5bef4794 100644 --- a/lib/pages/dynamics/controller.dart +++ b/lib/pages/dynamics/controller.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; +import 'package:hive/hive.dart'; import 'package:pilipala/http/dynamics.dart'; import 'package:pilipala/http/search.dart'; import 'package:pilipala/models/bangumi/info.dart'; @@ -12,6 +13,7 @@ import 'package:pilipala/models/dynamics/result.dart'; import 'package:pilipala/models/dynamics/up.dart'; import 'package:pilipala/models/live/item.dart'; import 'package:pilipala/utils/feed_back.dart'; +import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/utils.dart'; class DynamicsController extends GetxController { @@ -49,8 +51,19 @@ class DynamicsController extends GetxController { ]; bool flag = false; RxInt initialValue = 1.obs; + Box user = GStrorage.user; + RxBool userLogin = false.obs; + + @override + void onInit() { + userLogin.value = user.get(UserBoxKey.userLogin, defaultValue: false); + super.onInit(); + } Future queryFollowDynamic({type = 'init'}) async { + if (!userLogin.value) { + return {'status': false, 'msg': '未登录'}; + } if (type == 'init') { dynamicsList.clear(); } diff --git a/lib/pages/dynamics/view.dart b/lib/pages/dynamics/view.dart index becb933c..4f6b6a40 100644 --- a/lib/pages/dynamics/view.dart +++ b/lib/pages/dynamics/view.dart @@ -9,6 +9,7 @@ import 'package:pilipala/common/skeleton/dynamic_card.dart'; import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/models/dynamics/result.dart'; import 'package:pilipala/pages/main/index.dart'; +import 'package:pilipala/utils/event_bus.dart'; import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/storage.dart'; @@ -30,6 +31,7 @@ class _DynamicsPageState extends State late Future _futureBuilderFutureUp; bool _isLoadingMore = false; Box user = GStrorage.user; + EventBus eventBus = EventBus(); @override bool get wantKeepAlive => true; @@ -62,6 +64,14 @@ class _DynamicsPageState extends State } }, ); + + eventBus.on(EventName.loginEvent, (args) { + _dynamicsController.userLogin.value = args['status']; + setState(() { + _futureBuilderFuture = _dynamicsController.queryFollowDynamic(); + _futureBuilderFutureUp = _dynamicsController.queryFollowUp(); + }); + }); } @override @@ -107,71 +117,82 @@ class _DynamicsPageState extends State return const SizedBox(); } }), - Obx(() => Visibility( - visible: _dynamicsController.mid.value == -1, - child: CustomSlidingSegmentedControl( - initialValue: _dynamicsController.initialValue.value, - children: { - 1: Text( - '全部', - style: TextStyle( - fontSize: Theme.of(context) - .textTheme - .labelMedium! - .fontSize), + Obx( + () => _dynamicsController.userLogin.value + ? Visibility( + visible: _dynamicsController.mid.value == -1, + child: CustomSlidingSegmentedControl( + initialValue: + _dynamicsController.initialValue.value, + children: { + 1: Text( + '全部', + style: TextStyle( + fontSize: Theme.of(context) + .textTheme + .labelMedium! + .fontSize), + ), + 2: Text('投稿', + style: TextStyle( + fontSize: Theme.of(context) + .textTheme + .labelMedium! + .fontSize)), + 3: Text('番剧', + style: TextStyle( + fontSize: Theme.of(context) + .textTheme + .labelMedium! + .fontSize)), + // 4: Text( + // '专栏', + // style: TextStyle( + // fontSize: Theme.of(context) + // .textTheme + // .labelMedium! + // .fontSize), + // ), + }, + padding: 13.0, + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .surfaceVariant + .withOpacity(0.7), + borderRadius: BorderRadius.circular(20), + ), + thumbDecoration: BoxDecoration( + color: Theme.of(context).colorScheme.background, + borderRadius: BorderRadius.circular(20), + ), + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + onValueChanged: (v) { + feedBack(); + _dynamicsController.onSelectType(v); + }, ), - 2: Text('投稿', - style: TextStyle( - fontSize: Theme.of(context) - .textTheme - .labelMedium! - .fontSize)), - 3: Text('番剧', - style: TextStyle( - fontSize: Theme.of(context) - .textTheme - .labelMedium! - .fontSize)), - // 4: Text( - // '专栏', - // style: TextStyle( - // fontSize: Theme.of(context) - // .textTheme - // .labelMedium! - // .fontSize), - // ), - }, - padding: 13.0, - decoration: BoxDecoration( - color: Theme.of(context) - .colorScheme - .surfaceVariant - .withOpacity(0.7), - borderRadius: BorderRadius.circular(20), - ), - thumbDecoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: BorderRadius.circular(20), - ), - duration: const Duration(milliseconds: 300), - curve: Curves.easeInOut, - onValueChanged: (v) { - feedBack(); - _dynamicsController.onSelectType(v); - }, - ), - )) + ) + : Text('动态', + style: Theme.of(context).textTheme.titleMedium), + ) ], ), - Positioned( - right: 4, - top: 0, - bottom: 0, - child: IconButton( - padding: EdgeInsets.zero, - onPressed: () => - {feedBack(), _dynamicsController.resetSearch()}, - icon: const Icon(Icons.history, size: 21), + Obx( + () => Visibility( + visible: _dynamicsController.userLogin.value, + child: Positioned( + right: 4, + top: 0, + bottom: 0, + child: IconButton( + padding: EdgeInsets.zero, + onPressed: () => + {feedBack(), _dynamicsController.resetSearch()}, + icon: const Icon(Icons.history, size: 21), + ), + ), ), ), ], diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index 2b593cef..b771ab0f 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -4,6 +4,7 @@ import 'package:hive/hive.dart'; import 'package:pilipala/pages/dynamics/index.dart'; import 'package:pilipala/pages/home/index.dart'; import 'package:pilipala/pages/media/index.dart'; +import 'package:pilipala/utils/event_bus.dart'; import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/storage.dart'; import './controller.dart'; @@ -96,6 +97,7 @@ class _MainAppState extends State with SingleTickerProviderStateMixin { @override void dispose() async { await GStrorage.close(); + EventBus().off(EventName.loginEvent); super.dispose(); } diff --git a/lib/pages/media/view.dart b/lib/pages/media/view.dart index c251addf..13ab30bf 100644 --- a/lib/pages/media/view.dart +++ b/lib/pages/media/view.dart @@ -3,6 +3,7 @@ import 'package:get/get.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/models/user/fav_folder.dart'; import 'package:pilipala/pages/media/index.dart'; +import 'package:pilipala/utils/event_bus.dart'; import 'package:pilipala/utils/utils.dart'; class MediaPage extends StatefulWidget { @@ -16,6 +17,7 @@ class _MediaPageState extends State with AutomaticKeepAliveClientMixin { late MediaController mediaController; late Future _futureBuilderFuture; + EventBus eventBus = EventBus(); @override bool get wantKeepAlive => true; @@ -25,6 +27,12 @@ class _MediaPageState extends State super.initState(); mediaController = Get.put(MediaController()); _futureBuilderFuture = mediaController.queryFavFolder(); + eventBus.on(EventName.loginEvent, (args) { + mediaController.userLogin.value = args['status']; + setState(() { + _futureBuilderFuture = mediaController.queryFavFolder(); + }); + }); } @override @@ -68,7 +76,7 @@ class _MediaPageState extends State ), ), ], - Obx(() => mediaController.userLogin.value == true + Obx(() => mediaController.userLogin.value ? favFolder(mediaController, context) : const SizedBox()) ], diff --git a/lib/pages/mine/controller.dart b/lib/pages/mine/controller.dart index 9562f488..e4118154 100644 --- a/lib/pages/mine/controller.dart +++ b/lib/pages/mine/controller.dart @@ -32,9 +32,6 @@ class MineController extends GetxController { onLogin() async { if (!userLogin.value) { - /// TODO - Get.back(); - await Future.delayed(const Duration(milliseconds: 150)); Get.toNamed( '/webview', parameters: { diff --git a/lib/pages/mine/view.dart b/lib/pages/mine/view.dart index 4b422ed5..e084d96b 100644 --- a/lib/pages/mine/view.dart +++ b/lib/pages/mine/view.dart @@ -6,15 +6,37 @@ import 'package:get/get.dart'; import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/models/common/theme_type.dart'; +import 'package:pilipala/utils/event_bus.dart'; import 'controller.dart'; -class MinePage extends StatelessWidget { +class MinePage extends StatefulWidget { const MinePage({super.key}); @override - Widget build(BuildContext context) { - final MineController mineController = Get.put(MineController()); + State createState() => _MinePageState(); +} +class _MinePageState extends State { + final MineController mineController = Get.put(MineController()); + late Future _futureBuilderFuture; + EventBus eventBus = EventBus(); + + @override + void initState() { + super.initState(); + _futureBuilderFuture = mineController.queryUserInfo(); + eventBus.on(EventName.loginEvent, (args) { + mineController.userLogin.value = args['status']; + if (mounted) { + setState(() { + _futureBuilderFuture = mineController.queryUserInfo(); + }); + } + }); + } + + @override + Widget build(BuildContext context) { return Scaffold( appBar: AppBar( automaticallyImplyLeading: false, @@ -61,7 +83,7 @@ class MinePage extends StatelessWidget { children: [ const SizedBox(height: 10), FutureBuilder( - future: mineController.queryUserInfo(), + future: _futureBuilderFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { if (snapshot.data['status']) { diff --git a/lib/pages/setting/controller.dart b/lib/pages/setting/controller.dart index a0682776..0766340b 100644 --- a/lib/pages/setting/controller.dart +++ b/lib/pages/setting/controller.dart @@ -6,6 +6,7 @@ import 'package:pilipala/http/init.dart'; import 'package:pilipala/models/common/theme_type.dart'; import 'package:pilipala/pages/home/index.dart'; import 'package:pilipala/pages/mine/controller.dart'; +import 'package:pilipala/utils/event_bus.dart'; import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/storage.dart'; @@ -46,14 +47,25 @@ class SettingController extends GetxController { ), TextButton( onPressed: () async { + // 清空cookie await Request.cookieManager.cookieJar.deleteAll(); - await Get.find().resetUserInfo(); - userLogin.value = user.get(UserBoxKey.userLogin) ?? false; + Request.dio.options.headers['cookie'] = ''; + + // 清空本地存储的用户标识 userInfoCache.put('userInfoCache', null); + user.put(UserBoxKey.accessKey, {'mid': -1, 'value': ''}); + + // 更改我的页面登录状态 + await Get.find().resetUserInfo(); + + // 更改主页登录状态 HomeController homeCtr = Get.find(); homeCtr.updateLoginStatus(false); - user.put(UserBoxKey.accessKey, {'mid': -1, 'value': ''}); - Request.dio.options.headers['cookie'] = ''; + + // 事件通知 + EventBus eventBus = EventBus(); + eventBus.emit(EventName.loginEvent, {'status': false}); + SmartDialog.dismiss().then((value) => Get.back()); }, child: const Text('确认'), diff --git a/lib/pages/webview/controller.dart b/lib/pages/webview/controller.dart index 3bffe779..b5b50152 100644 --- a/lib/pages/webview/controller.dart +++ b/lib/pages/webview/controller.dart @@ -6,11 +6,9 @@ import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:pilipala/http/init.dart'; import 'package:pilipala/http/user.dart'; -import 'package:pilipala/pages/dynamics/index.dart'; import 'package:pilipala/pages/home/index.dart'; -import 'package:pilipala/pages/mine/index.dart'; -import 'package:pilipala/pages/rcmd/controller.dart'; import 'package:pilipala/utils/cookie.dart'; +import 'package:pilipala/utils/event_bus.dart'; import 'package:pilipala/utils/storage.dart'; import 'package:webview_flutter/webview_flutter.dart'; @@ -21,6 +19,7 @@ class WebviewController extends GetxController { final WebViewController controller = WebViewController(); RxInt loadProgress = 0.obs; RxBool loadShow = true.obs; + EventBus eventBus = EventBus(); @override void onInit() { @@ -74,10 +73,8 @@ class WebviewController extends GetxController { Box userInfoCache = GStrorage.userInfo; userInfoCache.put('userInfoCache', result['data']); - Get.find().userInfo.value = result['data']; - Get.find().onInit(); - Get.find().queryRcmdFeed('onRefresh'); - Get.find().onRefresh(); + // 通知更新 + eventBus.emit(EventName.loginEvent, {'status': true}); HomeController homeCtr = Get.find(); homeCtr.updateLoginStatus(true); diff --git a/lib/utils/event_bus.dart b/lib/utils/event_bus.dart new file mode 100644 index 00000000..cd010ef9 --- /dev/null +++ b/lib/utils/event_bus.dart @@ -0,0 +1,53 @@ +// 订阅者回调签名 +typedef void EventCallback(arg); + +class EventBus { + // 私有构造函数 + EventBus._internal(); + + // 保存单例 + static final EventBus _singleton = EventBus._internal(); + + // 工厂构造函数 + factory EventBus() => _singleton; + + // 保存事件订阅者队列,key:事件名(id),value: 对应事件的订阅者队列 + final _emap = >{}; + + // 添加订阅者 + void on(eventName, EventCallback f) { + _emap[eventName] ??= []; + _emap[eventName]!.add(f); + } + + // 移除订阅者 + void off(eventName, [EventCallback? f]) { + var list = _emap[eventName]; + if (eventName == null || list == null) return; + if (f == null) { + _emap[eventName] = []; + } else { + list.remove(f); + } + } + + // 触发事件,事件触发后该事件所有订阅者会被调用 + void emit(eventName, [arg]) { + var list = _emap[eventName]; + if (list == null) return; + List tempList = List.from(list); + for (var callback in tempList) { + callback(arg); + } + } + + // 获取订阅者数量 + int getSubscriberCount(eventName) { + var list = _emap[eventName]; + return list?.length ?? 0; + } +} + +class EventName { + static const String loginEvent = 'loginEvent'; +}