M4: 通用网页容器 + SettingsProxy + NavProvider + 子游戏切换
T-M4-01/02/03 GenericWebContainer(§11.3 第二套机制,不挂桥):
- javaScriptProxy 注入 settings 对象 6 方法(SettingsProxy,函数回调避开 ArkTS 对象字面量限制)
- 首次 100% runJavaScript 直调 getWebdata('<data>');返回键 isbackfinishweb→gamebackkeydown /
isexitdialogeshow→退出确认→backgameData();关闭 pop({data}) 101 语义回上层
- orientation "1"竖/其他横(window.setPreferredOrientation);browser 隐式 want
T-M3-06 NavProvider:OpenurlTitleData(开通用容器,onPop→callHandler getWebdata)、
SwitchOverGameData(同容器 loadUrl 切子游戏+重注入 app_data(launchtype'1')+方向+复位首屏标志)、
getGameinstall(同步 1/0 查 <解压根>/<dir>/index.html)、backgameData(重载大厅+待加载后 getWebdata)
导航解耦:common NavEvents(名+具名 payload interface);NavProvider 发 EventBus → BridgeGameContainer 执行
(容器持 pathStack/controller)。EventBus payload 放宽为 Object(ArkTS 禁 Record 字面量),用 GenericEventData
domain AppDataInjector.buildValues 复用(StartupOrchestrator + 子游戏切换共用,去重)
组装根装配 NavProvider
devecocli build 通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -11,3 +11,6 @@ export { IWebController, WebviewControllerAdapter, FakeWebController } from './s
|
||||
|
||||
// 桥 JS 读取器
|
||||
export { BridgeJsLoader, BRIDGE_JS_RAWFILE } from './src/main/ets/assets/BridgeJsLoader';
|
||||
|
||||
// 通用网页容器注入对象(§11.3,第二套机制)
|
||||
export { SettingsProxy, SettingsStrFn, SettingsFinishFn, SettingsBoolFn } from './src/main/ets/web/SettingsProxy';
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* 通用网页容器注入对象 settings(契约 §11.3,框架 §7.2)。
|
||||
*
|
||||
* 对象名固定 'settings',经 Web().javaScriptProxy 注入;H5 直接调 window.settings.<方法>(...)。
|
||||
* 6 个方法委托给容器传入的回调(ArkTS 严格模式下用函数参数而非对象字面量)。
|
||||
* ⚠ 这是与主容器(桥协议)不同的【第二套】机制,该容器无 WebViewJavascriptBridge。
|
||||
*/
|
||||
|
||||
/** 回调类型:入参字符串。 */
|
||||
export type SettingsStrFn = (s: string) => void;
|
||||
/** 回调类型:关闭(returnData 非空则 101 带数据回传)。 */
|
||||
export type SettingsFinishFn = (returnData: string | undefined) => void;
|
||||
/** 回调类型:布尔开关。 */
|
||||
export type SettingsBoolFn = (on: boolean) => void;
|
||||
|
||||
export class SettingsProxy {
|
||||
private readonly loadUrlFn: SettingsStrFn;
|
||||
private readonly browserFn: SettingsStrFn;
|
||||
private readonly finishFn: SettingsFinishFn;
|
||||
private readonly exitDialogFn: SettingsBoolFn;
|
||||
private readonly backToH5Fn: SettingsBoolFn;
|
||||
|
||||
constructor(loadUrlFn: SettingsStrFn, browserFn: SettingsStrFn, finishFn: SettingsFinishFn,
|
||||
exitDialogFn: SettingsBoolFn, backToH5Fn: SettingsBoolFn) {
|
||||
this.loadUrlFn = loadUrlFn;
|
||||
this.browserFn = browserFn;
|
||||
this.finishFn = finishFn;
|
||||
this.exitDialogFn = exitDialogFn;
|
||||
this.backToH5Fn = backToH5Fn;
|
||||
}
|
||||
|
||||
/** H5→原生:带数据返回上层(原生 setResult(101,{data}) 并关闭)。 */
|
||||
backgameData(data: string): void {
|
||||
this.finishFn(data);
|
||||
}
|
||||
|
||||
/** H5→原生:本容器加载新 url。 */
|
||||
loadurl(urls: string): void {
|
||||
this.loadUrlFn(urls);
|
||||
}
|
||||
|
||||
/** H5→原生:浏览器打开。 */
|
||||
browser(browserurl: string): void {
|
||||
this.browserFn(browserurl);
|
||||
}
|
||||
|
||||
/** H5→原生:直接关闭本页。 */
|
||||
finishweb(): void {
|
||||
this.finishFn(undefined);
|
||||
}
|
||||
|
||||
/** H5→原生:开启返回退出确认框。 */
|
||||
isexitdialogeshow(): void {
|
||||
this.exitDialogFn(true);
|
||||
}
|
||||
|
||||
/** H5→原生:返回键交给 H5。 */
|
||||
isbackfinishweb(): void {
|
||||
this.backToH5Fn(true);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user