fix: 登录/退出登录页面刷新

This commit is contained in:
guozhigq
2023-08-19 15:25:00 +08:00
parent 7c2518bcd2
commit 2b0dc9d285
9 changed files with 206 additions and 81 deletions

View File

@ -3,6 +3,7 @@
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';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:pilipala/http/dynamics.dart'; import 'package:pilipala/http/dynamics.dart';
import 'package:pilipala/http/search.dart'; import 'package:pilipala/http/search.dart';
import 'package:pilipala/models/bangumi/info.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/dynamics/up.dart';
import 'package:pilipala/models/live/item.dart'; import 'package:pilipala/models/live/item.dart';
import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/storage.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
class DynamicsController extends GetxController { class DynamicsController extends GetxController {
@ -49,8 +51,19 @@ class DynamicsController extends GetxController {
]; ];
bool flag = false; bool flag = false;
RxInt initialValue = 1.obs; 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 { Future queryFollowDynamic({type = 'init'}) async {
if (!userLogin.value) {
return {'status': false, 'msg': '未登录'};
}
if (type == 'init') { if (type == 'init') {
dynamicsList.clear(); dynamicsList.clear();
} }

View File

@ -9,6 +9,7 @@ import 'package:pilipala/common/skeleton/dynamic_card.dart';
import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/http_error.dart';
import 'package:pilipala/models/dynamics/result.dart'; import 'package:pilipala/models/dynamics/result.dart';
import 'package:pilipala/pages/main/index.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/feed_back.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
@ -30,6 +31,7 @@ class _DynamicsPageState extends State<DynamicsPage>
late Future _futureBuilderFutureUp; late Future _futureBuilderFutureUp;
bool _isLoadingMore = false; bool _isLoadingMore = false;
Box user = GStrorage.user; Box user = GStrorage.user;
EventBus eventBus = EventBus();
@override @override
bool get wantKeepAlive => true; bool get wantKeepAlive => true;
@ -62,6 +64,14 @@ class _DynamicsPageState extends State<DynamicsPage>
} }
}, },
); );
eventBus.on(EventName.loginEvent, (args) {
_dynamicsController.userLogin.value = args['status'];
setState(() {
_futureBuilderFuture = _dynamicsController.queryFollowDynamic();
_futureBuilderFutureUp = _dynamicsController.queryFollowUp();
});
});
} }
@override @override
@ -107,10 +117,13 @@ class _DynamicsPageState extends State<DynamicsPage>
return const SizedBox(); return const SizedBox();
} }
}), }),
Obx(() => Visibility( Obx(
() => _dynamicsController.userLogin.value
? Visibility(
visible: _dynamicsController.mid.value == -1, visible: _dynamicsController.mid.value == -1,
child: CustomSlidingSegmentedControl<int>( child: CustomSlidingSegmentedControl<int>(
initialValue: _dynamicsController.initialValue.value, initialValue:
_dynamicsController.initialValue.value,
children: { children: {
1: Text( 1: Text(
'全部', '全部',
@ -160,10 +173,16 @@ class _DynamicsPageState extends State<DynamicsPage>
_dynamicsController.onSelectType(v); _dynamicsController.onSelectType(v);
}, },
), ),
)) )
: Text('动态',
style: Theme.of(context).textTheme.titleMedium),
)
], ],
), ),
Positioned( Obx(
() => Visibility(
visible: _dynamicsController.userLogin.value,
child: Positioned(
right: 4, right: 4,
top: 0, top: 0,
bottom: 0, bottom: 0,
@ -174,6 +193,8 @@ class _DynamicsPageState extends State<DynamicsPage>
icon: const Icon(Icons.history, size: 21), icon: const Icon(Icons.history, size: 21),
), ),
), ),
),
),
], ],
), ),
), ),

View File

@ -4,6 +4,7 @@ import 'package:hive/hive.dart';
import 'package:pilipala/pages/dynamics/index.dart'; import 'package:pilipala/pages/dynamics/index.dart';
import 'package:pilipala/pages/home/index.dart'; import 'package:pilipala/pages/home/index.dart';
import 'package:pilipala/pages/media/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/feed_back.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
import './controller.dart'; import './controller.dart';
@ -96,6 +97,7 @@ class _MainAppState extends State<MainApp> with SingleTickerProviderStateMixin {
@override @override
void dispose() async { void dispose() async {
await GStrorage.close(); await GStrorage.close();
EventBus().off(EventName.loginEvent);
super.dispose(); super.dispose();
} }

View File

@ -3,6 +3,7 @@ import 'package:get/get.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/models/user/fav_folder.dart'; import 'package:pilipala/models/user/fav_folder.dart';
import 'package:pilipala/pages/media/index.dart'; import 'package:pilipala/pages/media/index.dart';
import 'package:pilipala/utils/event_bus.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
class MediaPage extends StatefulWidget { class MediaPage extends StatefulWidget {
@ -16,6 +17,7 @@ class _MediaPageState extends State<MediaPage>
with AutomaticKeepAliveClientMixin { with AutomaticKeepAliveClientMixin {
late MediaController mediaController; late MediaController mediaController;
late Future _futureBuilderFuture; late Future _futureBuilderFuture;
EventBus eventBus = EventBus();
@override @override
bool get wantKeepAlive => true; bool get wantKeepAlive => true;
@ -25,6 +27,12 @@ class _MediaPageState extends State<MediaPage>
super.initState(); super.initState();
mediaController = Get.put(MediaController()); mediaController = Get.put(MediaController());
_futureBuilderFuture = mediaController.queryFavFolder(); _futureBuilderFuture = mediaController.queryFavFolder();
eventBus.on(EventName.loginEvent, (args) {
mediaController.userLogin.value = args['status'];
setState(() {
_futureBuilderFuture = mediaController.queryFavFolder();
});
});
} }
@override @override
@ -68,7 +76,7 @@ class _MediaPageState extends State<MediaPage>
), ),
), ),
], ],
Obx(() => mediaController.userLogin.value == true Obx(() => mediaController.userLogin.value
? favFolder(mediaController, context) ? favFolder(mediaController, context)
: const SizedBox()) : const SizedBox())
], ],

View File

@ -32,9 +32,6 @@ class MineController extends GetxController {
onLogin() async { onLogin() async {
if (!userLogin.value) { if (!userLogin.value) {
/// TODO
Get.back();
await Future.delayed(const Duration(milliseconds: 150));
Get.toNamed( Get.toNamed(
'/webview', '/webview',
parameters: { parameters: {

View File

@ -6,15 +6,37 @@ import 'package:get/get.dart';
import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/constants.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/models/common/theme_type.dart'; import 'package:pilipala/models/common/theme_type.dart';
import 'package:pilipala/utils/event_bus.dart';
import 'controller.dart'; import 'controller.dart';
class MinePage extends StatelessWidget { class MinePage extends StatefulWidget {
const MinePage({super.key}); const MinePage({super.key});
@override @override
Widget build(BuildContext context) { State<MinePage> createState() => _MinePageState();
final MineController mineController = Get.put(MineController()); }
class _MinePageState extends State<MinePage> {
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( return Scaffold(
appBar: AppBar( appBar: AppBar(
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
@ -61,7 +83,7 @@ class MinePage extends StatelessWidget {
children: [ children: [
const SizedBox(height: 10), const SizedBox(height: 10),
FutureBuilder( FutureBuilder(
future: mineController.queryUserInfo(), future: _futureBuilderFuture,
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) { if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.data['status']) { if (snapshot.data['status']) {

View File

@ -6,6 +6,7 @@ import 'package:pilipala/http/init.dart';
import 'package:pilipala/models/common/theme_type.dart'; import 'package:pilipala/models/common/theme_type.dart';
import 'package:pilipala/pages/home/index.dart'; import 'package:pilipala/pages/home/index.dart';
import 'package:pilipala/pages/mine/controller.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/feed_back.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
@ -46,14 +47,25 @@ class SettingController extends GetxController {
), ),
TextButton( TextButton(
onPressed: () async { onPressed: () async {
// 清空cookie
await Request.cookieManager.cookieJar.deleteAll(); await Request.cookieManager.cookieJar.deleteAll();
await Get.find<MineController>().resetUserInfo(); Request.dio.options.headers['cookie'] = '';
userLogin.value = user.get(UserBoxKey.userLogin) ?? false;
// 清空本地存储的用户标识
userInfoCache.put('userInfoCache', null); userInfoCache.put('userInfoCache', null);
user.put(UserBoxKey.accessKey, {'mid': -1, 'value': ''});
// 更改我的页面登录状态
await Get.find<MineController>().resetUserInfo();
// 更改主页登录状态
HomeController homeCtr = Get.find<HomeController>(); HomeController homeCtr = Get.find<HomeController>();
homeCtr.updateLoginStatus(false); 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()); SmartDialog.dismiss().then((value) => Get.back());
}, },
child: const Text('确认'), child: const Text('确认'),

View File

@ -6,11 +6,9 @@ import 'package:get/get.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:pilipala/http/init.dart'; import 'package:pilipala/http/init.dart';
import 'package:pilipala/http/user.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/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/cookie.dart';
import 'package:pilipala/utils/event_bus.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart';
@ -21,6 +19,7 @@ class WebviewController extends GetxController {
final WebViewController controller = WebViewController(); final WebViewController controller = WebViewController();
RxInt loadProgress = 0.obs; RxInt loadProgress = 0.obs;
RxBool loadShow = true.obs; RxBool loadShow = true.obs;
EventBus eventBus = EventBus();
@override @override
void onInit() { void onInit() {
@ -74,10 +73,8 @@ class WebviewController extends GetxController {
Box userInfoCache = GStrorage.userInfo; Box userInfoCache = GStrorage.userInfo;
userInfoCache.put('userInfoCache', result['data']); userInfoCache.put('userInfoCache', result['data']);
Get.find<MineController>().userInfo.value = result['data']; // 通知更新
Get.find<MineController>().onInit(); eventBus.emit(EventName.loginEvent, {'status': true});
Get.find<RcmdController>().queryRcmdFeed('onRefresh');
Get.find<DynamicsController>().onRefresh();
HomeController homeCtr = Get.find<HomeController>(); HomeController homeCtr = Get.find<HomeController>();
homeCtr.updateLoginStatus(true); homeCtr.updateLoginStatus(true);

53
lib/utils/event_bus.dart Normal file
View File

@ -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 = <dynamic, List<EventCallback>>{};
// 添加订阅者
void on(eventName, EventCallback f) {
_emap[eventName] ??= <EventCallback>[];
_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<EventCallback> 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';
}