Commit 48f46717 by tanghuan

增加 openSetting 指令

1 parent 82b45967
......@@ -71,11 +71,11 @@ class SettingCubit extends Cubit<SettingState> {
/// 退出登录
Future<void> logout() async {
// 删除所有auth_开头的key
_prefs.getKeys().forEach((key) {
for (final key in _prefs.getKeys()) {
if (key.startsWith('auth_')) {
_prefs.remove(key);
await _prefs.remove(key);
}
});
}
// IM 登出
// await getIt.get<ImService>().logout();
......@@ -87,7 +87,7 @@ class SettingCubit extends Cubit<SettingState> {
Future<void> handleToggleDebug() async {
var debug = _prefs.getInt('debug') ?? 0;
debug = (debug == 0 ? 1 : 0);
_prefs.setInt('debug', debug);
await _prefs.setInt('debug', debug);
// 通知 WebCubit 更新 H5 状态
WebCubitHolder.instance?.notifyDebugStatus(debug);
......@@ -99,40 +99,45 @@ class SettingCubit extends Cubit<SettingState> {
WebCubitHolder.instance?.clearWebCache();
// 2 清理非 h5_version 的缓存
_prefs.getKeys().forEach((key) async {
for (final key in _prefs.getKeys()) {
if (!key.startsWith('h5')) {
await _prefs.remove(key);
}
});
}
// 3 清理 http_dist_assets 下的非当前版本号的文件和目录
var dir = await getApplicationSupportDirectory();
var httpDir = Directory('${dir.path}/${Constant.h5DistDir}');
if (httpDir.existsSync()) {
var version = _prefs.getString(Constant.h5VersionKey) ?? Constant.h5Version;
await for (final entity in httpDir.list()) {
if (entity is Directory) {
if (!entity.path.endsWith(version)) {
await entity.delete(recursive: true);
}
} else if (entity is File) {
if (!entity.path.endsWith('$version.zip')) {
await entity.delete();
}
}
}
await _cleanH5Dir(httpDir, version);
}
// 4 清理临时目录下的所有文件和目录
var tempDir = await getTemporaryDirectory();
if (tempDir.existsSync()) {
await for (final entity in tempDir.list()) {
if (entity is Directory) {
await entity.delete(recursive: true);
} else {
await entity.delete();
}
await _cleanAll(tempDir);
}
}
/// 清理 h5 目录下非当前版本的文件和目录
Future<void> _cleanH5Dir(Directory httpDir, String version) async {
await for (final entity in httpDir.list()) {
if (entity is Directory && !entity.path.endsWith(version)) {
await entity.delete(recursive: true);
} else if (entity is File && !entity.path.endsWith('$version.zip')) {
await entity.delete();
}
}
}
/// 清理目录下所有内容
Future<void> _cleanAll(Directory dir) async {
await for (final entity in dir.list()) {
if (entity is Directory) {
await entity.delete(recursive: true);
} else {
await entity.delete();
}
}
}
......
......@@ -19,6 +19,7 @@ import 'package:appframe/data/repositories/message/location_handler.dart';
import 'package:appframe/data/repositories/message/network_type_handler.dart';
import 'package:appframe/data/repositories/message/open_document_handler.dart';
import 'package:appframe/data/repositories/message/open_link_handler.dart';
import 'package:appframe/data/repositories/message/open_setting_handler.dart';
import 'package:appframe/data/repositories/message/open_weapp_handler.dart';
import 'package:appframe/data/repositories/message/orientation_handler.dart';
import 'package:appframe/data/repositories/message/role_info_handler.dart';
......@@ -108,6 +109,9 @@ Future<void> setupLocator() async {
/// 显示应用菜单
getIt.registerLazySingleton<MessageHandler>(() => AppMenuHandler(), instanceName: 'showAppMenu');
/// 打开设置内页
getIt.registerLazySingleton<MessageHandler>(() => OpenSettingHandler(), instanceName: 'openSetting');
/// 本地缓存
// Android已测试通过
getIt.registerLazySingleton<MessageHandler>(() => GetStorageHandler(), instanceName: 'getStorage');
......
import 'dart:io';
import 'package:appframe/config/constant.dart';
import 'package:appframe/config/locator.dart';
import 'package:appframe/config/routes.dart';
import 'package:appframe/services/dispatcher.dart';
import 'package:fluwx/fluwx.dart';
import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
class OpenSettingHandler extends MessageHandler {
/// 外链类配置:item -> (url, title)
static const Map<String, ({String url, String title})> _linkItems = {
'version': (url: 'https://bxr.banxiaoer.net/apps/versions.html', title: '版本记录'),
'license': (url: 'https://bxr.banxiaoer.net/apps/useragreement.html', title: '用户协议'),
'privacy': (url: 'https://bxr.banxiaoer.net/apps/privacysettings.html', title: '隐私设置'),
'about': (url: 'https://bxr.banxiaoer.net/apps/produce.html', title: '关于'),
};
@override
Future<dynamic> handleMessage(params) async {
if (params is! Map<String, dynamic>) {
throw Exception('参数错误');
}
var item = params['item'] as String;
if (item.isEmpty) {
throw Exception('参数错误');
}
// 1. 外链类
final link = _linkItems[item];
if (link != null) {
router.push('/link', extra: {'url': link.url, 'title': link.title});
return true;
}
// 2. 动作类
final handlers = <String, Future<bool> Function()>{
'account': _openAccount,
'kefu': _openKefu,
'clear': _handleClear,
'logout': _handleLogout,
'vconsole': _handleToggleDebug,
};
final handler = handlers[item];
if (handler != null) {
return await handler();
}
return false;
}
/// 账号与安全
Future<bool> _openAccount() async {
router.push('/account');
return true;
}
/// 在线客服(微信小程序)
Future<bool> _openKefu() async {
final fluwx = getIt.get<Fluwx>();
if (!await fluwx.isWeChatInstalled) {
return false;
}
fluwx.open(
target: MiniProgram(
username: 'gh_0ed02e873abc',
path: '/pages/agentChat/index?showAuthDirectly=1&agentId=eiXH0MAJmjgl',
miniProgramType: WXMiniProgramType.release,
),
);
return true;
}
/// 清理缓存入口
Future<bool> _handleClear() async {
await _clearStorage();
await _logout();
return true;
}
/// 退出登录入口
Future<bool> _handleLogout() async {
await _logout();
return true;
}
/// 切换调试模式入口
Future<bool> _handleToggleDebug() async {
final SharedPreferences prefs = getIt.get<SharedPreferences>();
var debug = prefs.getInt('debug') ?? 0;
debug = (debug == 0 ? 1 : 0);
await prefs.setInt('debug', debug);
// 通知 WebCubit 更新 H5 状态
WebCubitHolder.instance?.notifyDebugStatus(debug);
return true;
}
/// 清理缓存
Future<void> _clearStorage() async {
// 1 清理 WebView 相关缓存
WebCubitHolder.instance?.clearWebCache();
// 2 清理非 h5_version 的缓存
final SharedPreferences prefs = getIt.get<SharedPreferences>();
for (final key in prefs.getKeys()) {
if (!key.startsWith('h5')) {
await prefs.remove(key);
}
}
// 3 清理 http_dist_assets 下的非当前版本号的文件和目录
final dir = await getApplicationSupportDirectory();
final httpDir = Directory('${dir.path}/${Constant.h5DistDir}');
if (httpDir.existsSync()) {
final version = prefs.getString(Constant.h5VersionKey) ?? Constant.h5Version;
await _cleanH5Dir(httpDir, version);
}
// 4 清理临时目录下的所有文件和目录
final tempDir = await getTemporaryDirectory();
if (tempDir.existsSync()) {
await _cleanAll(tempDir);
}
}
/// 清理 h5 目录下非当前版本的文件和目录
Future<void> _cleanH5Dir(Directory httpDir, String version) async {
await for (final entity in httpDir.list()) {
if (entity is Directory && !entity.path.endsWith(version)) {
await entity.delete(recursive: true);
} else if (entity is File && !entity.path.endsWith('$version.zip')) {
await entity.delete();
}
}
}
/// 清理目录下所有内容
Future<void> _cleanAll(Directory dir) async {
await for (final entity in dir.list()) {
if (entity is Directory) {
await entity.delete(recursive: true);
} else {
await entity.delete();
}
}
}
/// 退出登录
Future<void> _logout() async {
// 删除所有auth_开头的key
final SharedPreferences prefs = getIt.get<SharedPreferences>();
for (final key in prefs.getKeys()) {
if (key.startsWith('auth_')) {
await prefs.remove(key);
}
}
// IM 登出
// await getIt.get<ImService>().logout();
router.go('/loginMain');
}
}
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!