hot_patch library

hot_patch —— Flutter 热更新运行时包。

面向「线上出 bug → 运行时切换到 JS 补丁修复」的场景: 构建期由 hot_patch_generator 把带注解的正常 widget 静态翻译成 同名 .js(与 dart 源文件对应),运行时用 JsUiWidget 加载 JS 补丁渲染组件、由 JS 驱动逻辑。

渲染入口是 JsUiWidget(宿主)+ JS 侧 __jsui 运行时(element / component / reconciler / context / commit 协议);每一项能力——无论 Flutter 等价物(Key / 各 Controller / BuildContext 代理 / NotificationListener)还是三方状态库(provider / GetX / …)——都通过 JsUiLibrary 子类接入;宿主只做「JS 结点 → Flutter widget」映射 (JsWidgetRegistry)+ 增量补丁应用(JsUiStore)。

接入一个新能力:继承 JsUiLibrary 重写需要的钩子,再 registerJsUiLibrary(...)(内建能力见 capabilities/js_ui_library.dart 的 _seedBuiltins;也可在 App 的 main() 里注册,从而完全不改本包)。 宿主核心文件零改动。

JS→原生能力统一走「宿主方法」:JS 侧唯一出口 _app_host_.invoke,宿主侧唯一 入口 JsRuntimeManager.registerHostMethod(业务方法用 @HostInjected 注解 由生成器注册,框架内建通道由 JsUiWidget 启动时注册),核心类零改动。

Classes

JsRenderContext
不需要动宿主;只有引入 Flutter 侧不存在的视觉 widget 才注册一条。
JsRuntimeManager
JS 运行时管理器:与底层 JavascriptRuntime 一对一。 每个 JsRuntimeManager 内部持有一个 JavascriptRuntime,所有与 JavascriptRuntime 相关的操作(创建、求值、通道注册、生命周期)都在 本类内部消化;JsUiWidget 等使用方只接触 JsRuntimeManager, 完全不感知底层运行时对象。
JsUiWidget
JS-UI 页面的宿主入口。
JsUiWidgetState
JsWidgetRegistry
type -> Flutter widget 注册表(宿主唯一扩展点)。

Functions

buildJsElement(Object? raw, void invoke(Object? handler, [List<Object?> args])) → Widget?
把产物里的元素描述({type, props, children, element})渲染成 widget。
buildMissingJsWidget(String type, List<Widget> children) → Widget
元素 type 未注册(既无宿主 builder、也无原生注入实现)时,给出可见占位。
isJsDataCarrierType(String type) → bool
该类型是否登记为非 Widget 数据载体(类型表驱动,不做类型名硬编码判断)。
registerBuiltinJsWidgets(JsWidgetRegistry r) → void
注册内置的宿主 widget 翻译。
registerJsDataCarrierType(String type) → void
登记一个「非 Widget 数据载体」类型。
registerNativeComponent(String name, Widget build(Map<String, dynamic> args)) → void
注册一个「无 JS 产物组件」的原生实现(如生成器对 @PatchIgnore / 无注解私有组件产出的「保留具体类型名」结点)。

Typedefs

JsWidgetBuilder = Widget Function(JsRenderContext c)

Exceptions / Errors

JsEvalException
JS 求值失败(JsRuntimeManager.evaluateOrThrow)。