Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
ethan
/
appframe
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
Commit 48f46717
authored
2026-05-22 16:56:30 +0800
by
tanghuan
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
增加 openSetting 指令
1 parent
82b45967
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
201 additions
and
24 deletions
lib/bloc/setting/setting_cubit.dart
lib/config/locator.dart
lib/data/repositories/message/open_setting_handler.dart
lib/bloc/setting/setting_cubit.dart
View file @
48f4671
...
@@ -71,11 +71,11 @@ class SettingCubit extends Cubit<SettingState> {
...
@@ -71,11 +71,11 @@ class SettingCubit extends Cubit<SettingState> {
/// 退出登录
/// 退出登录
Future
<
void
>
logout
()
async
{
Future
<
void
>
logout
()
async
{
// 删除所有auth_开头的key
// 删除所有auth_开头的key
_prefs
.
getKeys
().
forEach
((
key
)
{
for
(
final
key
in
_prefs
.
getKeys
()
)
{
if
(
key
.
startsWith
(
'auth_'
))
{
if
(
key
.
startsWith
(
'auth_'
))
{
_prefs
.
remove
(
key
);
await
_prefs
.
remove
(
key
);
}
}
}
);
}
// IM 登出
// IM 登出
// await getIt.get<ImService>().logout();
// await getIt.get<ImService>().logout();
...
@@ -87,7 +87,7 @@ class SettingCubit extends Cubit<SettingState> {
...
@@ -87,7 +87,7 @@ class SettingCubit extends Cubit<SettingState> {
Future
<
void
>
handleToggleDebug
()
async
{
Future
<
void
>
handleToggleDebug
()
async
{
var
debug
=
_prefs
.
getInt
(
'debug'
)
??
0
;
var
debug
=
_prefs
.
getInt
(
'debug'
)
??
0
;
debug
=
(
debug
==
0
?
1
:
0
);
debug
=
(
debug
==
0
?
1
:
0
);
_prefs
.
setInt
(
'debug'
,
debug
);
await
_prefs
.
setInt
(
'debug'
,
debug
);
// 通知 WebCubit 更新 H5 状态
// 通知 WebCubit 更新 H5 状态
WebCubitHolder
.
instance
?.
notifyDebugStatus
(
debug
);
WebCubitHolder
.
instance
?.
notifyDebugStatus
(
debug
);
...
@@ -99,40 +99,45 @@ class SettingCubit extends Cubit<SettingState> {
...
@@ -99,40 +99,45 @@ class SettingCubit extends Cubit<SettingState> {
WebCubitHolder
.
instance
?.
clearWebCache
();
WebCubitHolder
.
instance
?.
clearWebCache
();
// 2 清理非 h5_version 的缓存
// 2 清理非 h5_version 的缓存
_prefs
.
getKeys
().
forEach
((
key
)
async
{
for
(
final
key
in
_prefs
.
getKeys
())
{
if
(!
key
.
startsWith
(
'h5'
))
{
if
(!
key
.
startsWith
(
'h5'
))
{
await
_prefs
.
remove
(
key
);
await
_prefs
.
remove
(
key
);
}
}
}
);
}
// 3 清理 http_dist_assets 下的非当前版本号的文件和目录
// 3 清理 http_dist_assets 下的非当前版本号的文件和目录
var
dir
=
await
getApplicationSupportDirectory
();
var
dir
=
await
getApplicationSupportDirectory
();
var
httpDir
=
Directory
(
'
${dir.path}
/
${Constant.h5DistDir}
'
);
var
httpDir
=
Directory
(
'
${dir.path}
/
${Constant.h5DistDir}
'
);
if
(
httpDir
.
existsSync
())
{
if
(
httpDir
.
existsSync
())
{
var
version
=
_prefs
.
getString
(
Constant
.
h5VersionKey
)
??
Constant
.
h5Version
;
var
version
=
_prefs
.
getString
(
Constant
.
h5VersionKey
)
??
Constant
.
h5Version
;
await
_cleanH5Dir
(
httpDir
,
version
);
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
();
}
}
}
}
}
// 4 清理临时目录下的所有文件和目录
// 4 清理临时目录下的所有文件和目录
var
tempDir
=
await
getTemporaryDirectory
();
var
tempDir
=
await
getTemporaryDirectory
();
if
(
tempDir
.
existsSync
())
{
if
(
tempDir
.
existsSync
())
{
await
for
(
final
entity
in
tempDir
.
list
())
{
await
_cleanAll
(
tempDir
);
if
(
entity
is
Directory
)
{
}
await
entity
.
delete
(
recursive:
true
);
}
}
else
{
await
entity
.
delete
();
/// 清理 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
();
}
}
}
}
}
}
...
...
lib/config/locator.dart
View file @
48f4671
...
@@ -19,6 +19,7 @@ import 'package:appframe/data/repositories/message/location_handler.dart';
...
@@ -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/network_type_handler.dart'
;
import
'package:appframe/data/repositories/message/open_document_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_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/open_weapp_handler.dart'
;
import
'package:appframe/data/repositories/message/orientation_handler.dart'
;
import
'package:appframe/data/repositories/message/orientation_handler.dart'
;
import
'package:appframe/data/repositories/message/role_info_handler.dart'
;
import
'package:appframe/data/repositories/message/role_info_handler.dart'
;
...
@@ -108,6 +109,9 @@ Future<void> setupLocator() async {
...
@@ -108,6 +109,9 @@ Future<void> setupLocator() async {
/// 显示应用菜单
/// 显示应用菜单
getIt
.
registerLazySingleton
<
MessageHandler
>(()
=>
AppMenuHandler
(),
instanceName:
'showAppMenu'
);
getIt
.
registerLazySingleton
<
MessageHandler
>(()
=>
AppMenuHandler
(),
instanceName:
'showAppMenu'
);
/// 打开设置内页
getIt
.
registerLazySingleton
<
MessageHandler
>(()
=>
OpenSettingHandler
(),
instanceName:
'openSetting'
);
/// 本地缓存
/// 本地缓存
// Android已测试通过
// Android已测试通过
getIt
.
registerLazySingleton
<
MessageHandler
>(()
=>
GetStorageHandler
(),
instanceName:
'getStorage'
);
getIt
.
registerLazySingleton
<
MessageHandler
>(()
=>
GetStorageHandler
(),
instanceName:
'getStorage'
);
...
...
lib/data/repositories/message/open_setting_handler.dart
0 → 100644
View file @
48f4671
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'
);
}
}
Write
Preview
Styling with
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment