fix: 登录/退出登录页面刷新
This commit is contained in:
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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())
|
||||||
],
|
],
|
||||||
|
@ -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: {
|
||||||
|
@ -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']) {
|
||||||
|
@ -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('确认'),
|
||||||
|
@ -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
53
lib/utils/event_bus.dart
Normal 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';
|
||||||
|
}
|
Reference in New Issue
Block a user