Pārlūkot izejas kodu

[new]新增EventBus,增加登录和退出登录监听

Destiny 1 gadu atpakaļ
vecāks
revīzija
17cdb0ef50

BIN
assets/images/icon_logoff.webp


+ 2 - 0
assets/string/base/string.xml

@@ -22,6 +22,8 @@
     <string name="user_agreement">用户协议</string>
     <string name="main_drawer_check_updates">检查更新</string>
     <string name="main_drawer_complaint_and_report">投诉举报</string>
+    <string name="main_drawer_logout">退出登录</string>
+    <string name="main_drawer_logoff">注销账号</string>
     <string name="main_drawer_record_number">备案号216545885</string>
     <string name="network_error">网络异常</string>
     <string name="account">用户</string>

+ 16 - 0
lib/data/repositories/account_repository.dart

@@ -1,6 +1,7 @@
 import 'dart:async';
 
 import 'package:electronic_assistant/data/api/atmob_api.dart';
+import 'package:electronic_assistant/utils/event_bus.dart';
 import 'package:electronic_assistant/utils/mmkv_util.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
@@ -11,6 +12,9 @@ import '../api/request/login_request.dart';
 import '../api/request/verification_code_request.dart';
 import '../api/response/login_response.dart';
 
+const String EventUserLogin = 'EventUserLogin';
+const String EventUserLogout = 'EventUserLogout';
+
 class AccountRepository {
   final ACCOUNT_TOKEN = 'account_token';
   final ACCOUNT_PHONE = 'account_phone';
@@ -55,6 +59,8 @@ class AccountRepository {
     KVUtil.putString(ACCOUNT_TOKEN, token);
     KVUtil.putString(ACCOUNT_PHONE, phone);
     isLogin.value = true;
+
+    eventBus.emit(EventUserLogin);
   }
 
   void logout() {
@@ -63,6 +69,16 @@ class AccountRepository {
     KVUtil.putString(ACCOUNT_TOKEN, null);
     KVUtil.putString(ACCOUNT_PHONE, null);
     isLogin.value = false;
+
+    eventBus.emit(EventUserLogout);
+  }
+
+  void cleanLoginInfo() {
+    _phone = null;
+    _phone = null;
+    KVUtil.putString(ACCOUNT_TOKEN, null);
+    KVUtil.putString(ACCOUNT_PHONE, null);
+    isLogin.value = false;
   }
 
   void refreshUserInfo() {}

+ 18 - 1
lib/module/home/controller.dart

@@ -5,6 +5,7 @@ import 'package:electronic_assistant/data/repositories/task_repository.dart';
 import 'package:electronic_assistant/module/home/view.dart';
 import 'package:electronic_assistant/module/main/controller.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
+import 'package:electronic_assistant/utils/event_bus.dart';
 import 'package:electronic_assistant/utils/toast_util.dart';
 import 'package:electronic_assistant/widget/pull_to_refresh.dart';
 import 'package:get/get.dart';
@@ -30,6 +31,22 @@ class HomePageController extends BaseController {
   void onReady() {
     super.onReady();
     refreshController.requestRefresh();
+
+    eventBus.on(EventUserLogin, (arg) {
+      requestHomeData();
+    });
+
+    eventBus.on(EventUserLogout, (arg) {
+      requestHomeData();
+    });
+  }
+
+  @override
+  void dispose() {
+    // TODO: implement dispose
+    super.dispose();
+    eventBus.off(EventUserLogin);
+    eventBus.off(EventUserLogout);
   }
 
   void requestHomeData() {
@@ -42,7 +59,7 @@ class HomePageController extends BaseController {
     }).whenComplete(() {
       refreshController.refreshCompleted();
     }).catchError((e) {
-      accountRepository.logout();
+      // accountRepository.logout();
     });
   }
 

+ 2 - 0
lib/module/home/view.dart

@@ -1,5 +1,6 @@
 import 'package:electronic_assistant/base/base_page.dart';
 import 'package:electronic_assistant/data/bean/talks.dart';
+import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/dialog/rename_dialog.dart';
 import 'package:electronic_assistant/dialog/talk_delete_dialog.dart';
 import 'package:electronic_assistant/popup/talk_popup.dart';
@@ -166,6 +167,7 @@ class HomePage extends BasePage<HomePageController> {
               ),
             )),
         onTap: () {
+          accountRepository.logout();
           ToastUtil.showToast('GoStore');
         });
   }

+ 29 - 2
lib/module/main/drawer_view.dart

@@ -1,3 +1,4 @@
+import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/module/main/controller.dart';
 import 'package:electronic_assistant/utils/app_info_util.dart';
 import 'package:electronic_assistant/utils/expand.dart';
@@ -11,7 +12,7 @@ import '../../resource/colors.gen.dart';
 import '../../resource/string.gen.dart';
 import '../../router/app_pages.dart';
 
-Widget buildDrawerContent(MainController controller) {
+Widget buildDrawerContent(MainController controller, BuildContext context) {
   return SafeArea(
     child: Padding(
       padding: EdgeInsets.symmetric(horizontal: 16.w),
@@ -127,10 +128,36 @@ Widget buildDrawerContent(MainController controller) {
                   Assets.images.iconComplaintAndReport.image(),
                   StringName.mainDrawerComplaintAndReport.tr,
                   () {},
-                )
+                ),
+                buildOperationItem(
+                  Assets.images.iconLogoff.image(),
+                  StringName.mainDrawerLogoff.tr,
+                  () {},
+                ),
               ],
             ),
           ),
+          SizedBox(height: 8.h),
+          GestureDetector(
+            onTap: () {
+              accountRepository.logout();
+              Navigator.pop(context);
+            },
+            child: Container(
+              height: 44.h,
+              alignment: Alignment.center,
+              decoration: BoxDecoration(
+                color: ColorName.white,
+                borderRadius: BorderRadius.circular(8.w),
+              ),
+              child: Text(
+                StringName.mainDrawerLogout.tr,
+                style: TextStyle(
+                  color: "#25262A".toColor(),
+                ),
+              ),
+            ),
+          ),
           const Spacer(),
           Padding(
             padding: const EdgeInsets.only(bottom: 22).h,

+ 1 - 1
lib/module/main/view.dart

@@ -38,7 +38,7 @@ class MainTabPage extends BasePage<MainController> {
           borderRadius: BorderRadius.zero,
         ),
         backgroundColor: "#F6F5F8".toColor(),
-        child: buildDrawerContent(controller),
+        child: buildDrawerContent(controller, context),
       ),
     );
   }

+ 48 - 0
lib/utils/event_bus.dart

@@ -0,0 +1,48 @@
+//订阅者回调签名
+typedef void EventCallback(arg);
+
+class EventBus {
+  //私有构造函数
+  EventBus._internal();
+
+  //保存单例
+  static final EventBus _singleton = EventBus._internal();
+
+  //工厂构造函数
+  factory EventBus() => _singleton;
+
+  //保存事件订阅者队列,key:事件名(id),value: 对应事件的订阅者队列
+  final _emap = <Object, List<EventCallback>?>{};
+
+  //添加订阅者
+  void on(eventName, EventCallback f) {
+    if (eventName == null) return;
+    _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] = null;
+    } else {
+      list.remove(f);
+    }
+  }
+
+  //触发事件,事件触发后该事件所有订阅者会被调用
+  void emit(eventName, [arg]) {
+    var list = _emap[eventName];
+    if (list == null) return;
+    int len = list.length - 1;
+    //反向遍历,防止在订阅者在回调中移除自身带来的下标错位
+    for (var i = len; i > -1; --i) {
+      list[i](arg);
+    }
+  }
+}
+
+//定义一个top-level变量,页面引入该文件后可以直接使用bus
+var eventBus = EventBus();