Kraken widget

我们在 Flutter 应用中接入 Kraken 时,可以通过下列的这些配置来改变 Kraken Widget 的默认属性。

容器配置

background

自定义 Kraken 容器的背景色。

示例:

  1. Color color = const Color(0x000000);
  2. Kraken kraken = Kraken(
  3. background: color,
  4. );

viewportWidth

自定义 Kraken 容器的宽度。

示例:

  1. Kraken kraken = Kraken(
  2. viewportWidth: window.physicalSize.width / window.devicePixelRatio,
  3. );

viewportHeight

自定义 Kraken 容器的高度。

示例:

  1. Kraken kraken = Kraken(
  2. viewportHeight: window.physicalSize.height / window.devicePixelRatio,
  3. );

加载 Bundle

远程 Bundle

需加载执行的 JavaScript/Bytecode 脚本的 URL。

示例:

  1. Kraken kraken = Kraken(
  2. bundle: KrakenBundle.fromUrl('http://example.com/path/to/js),
  3. );

本地 Bundle

需加载执行的 JavaScript/Bytecode 本地路径。

示例:

  1. Kraken kraken = Kraken(
  2. bundle: KrakenBundle.fromUrl('assets://assets/bundle.js')
  3. );

JavaScript String 内容

需加载执行的 JavaScript 脚本的 String 内容。

示例:

  1. Kraken kraken = Kraken(
  2. bundle: KrakenBundle.fromContent('console.log(1)'),
  3. );

JavaScript Bytecode 内容

需加载执行的 JavaScript 脚本的 Bytecode 内容。

示例:

  1. Kraken kraken = Kraken(
  2. bundle: KrakenBundle.fromBytecode(bytecode),
  3. );

事件

onLoad

在文档装载完成后会触发 onLoad 事件。

示例:

  1. Kraken kraken = Kraken(
  2. onLoad: (KrakenController controller) {
  3. // ...
  4. },
  5. );

onLoadError

在文档装载异常的回调函数。

示例:

  1. Kraken kraken = Kraken(
  2. onLoadError: (FlutterError error, StackTrace stackTrace) {
  3. // ...
  4. },
  5. );

onJSError

JavaScript 执行异常时通过该回调抛出异常。

示例:

  1. Kraken kraken = Kraken(
  2. onJSError: (String message) {
  3. // ...
  4. },
  5. );

开启调试

debugEnableInspector

强制开启调试模式,默认为 true。

示例:

  1. Kraken kraken = Kraken(
  2. debugEnableInspector: false,
  3. );

手势

gestureListener

监听 Kraken 抛出的交互行为事件。

方法

  • dragStartCallback
    手势开始时触发
  • dragUpdateCallback
    手势移动时触发
  • dragEndCallback
    手势结束时触发

示例:

  1. Kraken(
  2. GestureListener: gestureListener(
  3. onDrag: (GestureEvent gestureEvent) {
  4. if (gestureEvent.state == EVENT_STATE_START) {
  5. //...
  6. } else if (gestureEvent.state == EVENT_STATE_UPDATE) {
  7. //...
  8. } else if (gestureEvent.state == EVENT_STATE_END) {
  9. //...
  10. }
  11. },
  12. onTouchStart: (TouchEvent touchEvent) {
  13. //...
  14. },
  15. onTouchEnd: (TouchEvent touchEvent) {
  16. //...
  17. },
  18. onTouchMove: (TouchEvent touchEvent) {
  19. //...
  20. }
  21. ),
  22. )

动画控制

animationController

Widget 动画控制器。为了避免初次执行 JavaScript 而导致的卡顿,使用这个参数可以让 JavaScript 在外部动画执行结束之后再开始执行。

示例:

  1. class FirstRoute extends StatelessWidget {
  2. @override
  3. Widget build(BuildContext context) {
  4. return Scaffold(
  5. appBar: AppBar(
  6. title: Text('First Route'),
  7. ),
  8. body: Center(
  9. child: RaisedButton(
  10. child: Text('Open route'),
  11. onPressed: () {
  12. MaterialPageRoute route;
  13. routeBuilder(context) {
  14. return SecondRoute(route.controller);
  15. }
  16. route = MaterialPageRoute(builder: routeBuilder);
  17. Navigator.push(
  18. context,
  19. route,
  20. );
  21. },
  22. ),
  23. ),
  24. );
  25. }
  26. }
  27. class SecondRoute extends StatelessWidget {
  28. final AnimationController controller;
  29. SecondRoute(this.controller);
  30. @override
  31. Widget build(BuildContext context) {
  32. return Scaffold(
  33. appBar: AppBar(
  34. title: Text("Second Route"),
  35. ),
  36. body: Wrap(
  37. children: <Widget>[
  38. Kraken(
  39. bundlePath: 'assets/bundle.js',
  40. animationController: controller,
  41. )
  42. ],
  43. ));
  44. }
  45. }

页面跳转

navigationDelegate

实现在 Kraken 视图的加载以及完成导航请求过程中触发的自定义行为。

示例:

  1. KrakenNavigationDelegate navigationDelegate = KrakenNavigationDelegate();
  2. navigationDelegate.errorHandler = (Object error, Object stack) {};
  3. navigationDelegate.setDecisionHandler((KrakenNavigationAction action) async {
  4. // ...
  5. return KrakenNavigationActionPolicy.cancel;
  6. });
  7. Kraken kraken = Kraken(
  8. navigationDelegate: navigationDelegate,
  9. );

与 JS 通信

javaScriptChannel

与 JavaScript 交换信息的通道。

示例:

  1. KrakenJavaScriptChannel javaScriptChannel = KrakenJavaScriptChannel();
  2. javaScriptChannel.onMethodCall = (String method, dynamic arguments) async {
  3. Completer completer = Completer<String>();
  4. Timer(Duration(seconds: 1), () {
  5. completer.complete('helloworld');
  6. });
  7. return completer.future;
  8. };
  9. Krake kraken = Kraken(
  10. javaScriptChannel: javaScriptChannel,
  11. ),