Kraken widget
我们在 Flutter 应用中接入 Kraken 时,可以通过下列的这些配置来改变 Kraken Widget 的默认属性。
容器配置
background
自定义 Kraken 容器的背景色。
示例:
Color color = const Color(0x000000);
Kraken kraken = Kraken(
background: color,
);
viewportWidth
自定义 Kraken 容器的宽度。
示例:
Kraken kraken = Kraken(
viewportWidth: window.physicalSize.width / window.devicePixelRatio,
);
viewportHeight
自定义 Kraken 容器的高度。
示例:
Kraken kraken = Kraken(
viewportHeight: window.physicalSize.height / window.devicePixelRatio,
);
加载 Bundle
远程 Bundle
需加载执行的 JavaScript/Bytecode 脚本的 URL。
示例:
Kraken kraken = Kraken(
bundle: KrakenBundle.fromUrl('http://example.com/path/to/js),
);
本地 Bundle
需加载执行的 JavaScript/Bytecode 本地路径。
示例:
Kraken kraken = Kraken(
bundle: KrakenBundle.fromUrl('assets://assets/bundle.js')
);
JavaScript String 内容
需加载执行的 JavaScript 脚本的 String 内容。
示例:
Kraken kraken = Kraken(
bundle: KrakenBundle.fromContent('console.log(1)'),
);
JavaScript Bytecode 内容
需加载执行的 JavaScript 脚本的 Bytecode 内容。
示例:
Kraken kraken = Kraken(
bundle: KrakenBundle.fromBytecode(bytecode),
);
事件
onLoad
在文档装载完成后会触发 onLoad 事件。
示例:
Kraken kraken = Kraken(
onLoad: (KrakenController controller) {
// ...
},
);
onLoadError
在文档装载异常的回调函数。
示例:
Kraken kraken = Kraken(
onLoadError: (FlutterError error, StackTrace stackTrace) {
// ...
},
);
onJSError
JavaScript 执行异常时通过该回调抛出异常。
示例:
Kraken kraken = Kraken(
onJSError: (String message) {
// ...
},
);
开启调试
debugEnableInspector
强制开启调试模式,默认为 true。
示例:
Kraken kraken = Kraken(
debugEnableInspector: false,
);
手势
gestureListener
监听 Kraken 抛出的交互行为事件。
方法
dragStartCallback
手势开始时触发dragUpdateCallback
手势移动时触发dragEndCallback
手势结束时触发
示例:
Kraken(
GestureListener: gestureListener(
onDrag: (GestureEvent gestureEvent) {
if (gestureEvent.state == EVENT_STATE_START) {
//...
} else if (gestureEvent.state == EVENT_STATE_UPDATE) {
//...
} else if (gestureEvent.state == EVENT_STATE_END) {
//...
}
},
onTouchStart: (TouchEvent touchEvent) {
//...
},
onTouchEnd: (TouchEvent touchEvent) {
//...
},
onTouchMove: (TouchEvent touchEvent) {
//...
}
),
)
动画控制
animationController
Widget 动画控制器。为了避免初次执行 JavaScript 而导致的卡顿,使用这个参数可以让 JavaScript 在外部动画执行结束之后再开始执行。
示例:
class FirstRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('First Route'),
),
body: Center(
child: RaisedButton(
child: Text('Open route'),
onPressed: () {
MaterialPageRoute route;
routeBuilder(context) {
return SecondRoute(route.controller);
}
route = MaterialPageRoute(builder: routeBuilder);
Navigator.push(
context,
route,
);
},
),
),
);
}
}
class SecondRoute extends StatelessWidget {
final AnimationController controller;
SecondRoute(this.controller);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Second Route"),
),
body: Wrap(
children: <Widget>[
Kraken(
bundlePath: 'assets/bundle.js',
animationController: controller,
)
],
));
}
}
页面跳转
navigationDelegate
实现在 Kraken 视图的加载以及完成导航请求过程中触发的自定义行为。
示例:
KrakenNavigationDelegate navigationDelegate = KrakenNavigationDelegate();
navigationDelegate.errorHandler = (Object error, Object stack) {};
navigationDelegate.setDecisionHandler((KrakenNavigationAction action) async {
// ...
return KrakenNavigationActionPolicy.cancel;
});
Kraken kraken = Kraken(
navigationDelegate: navigationDelegate,
);
与 JS 通信
javaScriptChannel
与 JavaScript 交换信息的通道。
示例:
KrakenJavaScriptChannel javaScriptChannel = KrakenJavaScriptChannel();
javaScriptChannel.onMethodCall = (String method, dynamic arguments) async {
Completer completer = Completer<String>();
Timer(Duration(seconds: 1), () {
completer.complete('helloworld');
});
return completer.future;
};
Krake kraken = Kraken(
javaScriptChannel: javaScriptChannel,
),