Flutter JavaScript引擎插件mercuryjs的使用

Flutter JavaScript引擎插件mercuryjs的使用

mercuryjs 是一个用于在 Flutter 应用程序中执行 JavaScript 的插件。它允许你将现有的 JavaScript 代码库集成到你的 Flutter 应用中。以下是一个完整的示例,展示如何使用 mercuryjs 插件。

示例代码

/*
 * Copyright (C) 2019-2022 The Kraken authors. All rights reserved.
 * Copyright (C) 2022-present The WebF authors. All rights reserved.
 */

import 'package:flutter/material.dart';
import 'package:mercuryjs/mercuryjs.dart';
import 'package:mercuryjs/devtools.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // 这个小部件是你应用程序的根。
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Mercury Example',
      debugShowCheckedModeBanner: false,
      home: MyBrowser(),
    );
  }
}

class MyBrowser extends StatefulWidget {
  MyBrowser({Key? key, this.title}) : super(key: key);

  // 这个小部件是你的应用的首页。它是有状态的,意味着它有一个状态对象(定义在下面),该状态对象包含影响其外观的字段。
  // 这个类是状态的配置。它保留了由父组件(在这个例子中是App小部件)提供的值(在这个例子中是标题)并用于状态的构建方法。小部件子类中的字段总是标记为“final”。

  final String? title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyBrowser> {
  // 定义输入框边框样式
  OutlineInputBorder outlineBorder = OutlineInputBorder(
    borderSide: BorderSide(color: Colors.transparent, width: 0.0),
    borderRadius: const BorderRadius.all(
      Radius.circular(20.0),
    ),
  );

  // 创建 Mercury 实例
  Mercury? mercuryjs;

  // 用于显示的消息
  String message = 'Loading...';

  @override
  Widget build(BuildContext context) {
    // 初始化 Mercury 实例
    mercuryjs ??= Mercury(
      devToolsService: ChromeDevToolsService(),
      bundle: MercuryBundle.fromUrl('assets:assets/bundle.js'),
      onControllerCreated: (controller) {
        setState(() {
          message = 'Controller loading...';
        });
        // 当控制器加载完成后,执行一些操作
        controller.onLoad = (controller) {
          setState(() {
            message = 'Context loading...';
          });
          // 订阅 JavaScript 上下文中的消息
          controller.context.dispatcher?.subscribe('example', (args) {
            setState(() {
              message = args[0]['message'];
            });
          });
          // 在上下文中执行 JavaScript 代码
          controller.context.evaluateJavaScripts('hello();');
        };
      }
    );
    return Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.black87,
          titleSpacing: 10.0,
          title: Container(
            height: 40.0,
            child: Text('Mercury 测试')
          ),
        ),
        body: Center(
          // 中心布局小部件。它接受单个子元素,并将其放置在父元素的中间。
          child: Column(
            children: [Text(message)],
          ),
        ));
  }
}

说明

  1. 导入必要的包

    import 'package:flutter/material.dart';
    import 'package:mercuryjs/mercuryjs.dart';
    import 'package:mercuryjs/devtools.dart';
    
  2. 初始化应用

    void main() {
      runApp(MyApp());
    }
    
  3. 创建主应用界面

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Mercury Example',
          debugShowCheckedModeBanner: false,
          home: MyBrowser(),
        );
      }
    }
    
  4. 创建浏览器界面

    class MyBrowser extends StatefulWidget {
      MyBrowser({Key? key, this.title}) : super(key: key);
    
      final String? title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
  5. 管理浏览器状态

    class _MyHomePageState extends State<MyBrowser> {
      // 输入框边框样式
      OutlineInputBorder outlineBorder = OutlineInputBorder(
        borderSide: BorderSide(color: Colors.transparent, width: 0.0),
        borderRadius: const BorderRadius.all(
          Radius.circular(20.0),
        ),
      );
    
      // Mercury 实例
      Mercury? mercuryjs;
    
      // 显示的消息
      String message = 'Loading...';
    
      @override
      Widget build(BuildContext context) {
        // 初始化 Mercury 实例
        mercuryjs ??= Mercury(
          devToolsService: ChromeDevToolsService(),
          bundle: MercuryBundle.fromUrl('assets:assets/bundle.js'),
          onControllerCreated: (controller) {
            setState(() {
              message = 'Controller loading...';
            });
            // 当控制器加载完成后,执行一些操作
            controller.onLoad = (controller) {
              setState(() {
                message = 'Context loading...';
              });
              // 订阅 JavaScript 上下文中的消息
              controller.context.dispatcher?.subscribe('example', (args) {
                setState(() {
                  message = args[0]['message'];
                });
              });
              // 在上下文中执行 JavaScript 代码
              controller.context.evaluateJavaScripts('hello();');
            };
          }
        );
        return Scaffold(
            appBar: AppBar(
              backgroundColor: Colors.black87,
              titleSpacing: 10.0,
              title: Container(
                height: 40.0,
                child: Text('Mercury 测试')
              ),
            ),
            body: Center(
              child: Column(
                children: [Text(message)],
              ),
            ));
      }
    }
    

更多关于Flutter JavaScript引擎插件mercuryjs的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter JavaScript引擎插件mercuryjs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用MercuryJS插件的示例代码。MercuryJS是一个允许Flutter应用内嵌并运行JavaScript代码的插件。

前提条件

  1. 确保你已经安装了Flutter和Dart的开发环境。
  2. 确保你的Flutter项目已经初始化。

步骤

1. 添加依赖

首先,在你的pubspec.yaml文件中添加MercuryJS的依赖:

dependencies:
  flutter:
    sdk: flutter
  mercury_js: ^最新版本号  # 请替换为实际可用的最新版本号

然后运行flutter pub get来安装依赖。

2. 配置Android权限(如果需要)

如果你的JavaScript代码需要访问特定的Android权限(例如网络访问),你需要在android/app/src/main/AndroidManifest.xml中添加相应的权限。例如:

<uses-permission android:name="android.permission.INTERNET"/>

3. 使用MercuryJS插件

接下来,在你的Flutter代码中使用MercuryJS插件。以下是一个简单的示例,展示如何在Flutter中运行JavaScript代码并获取结果。

import 'package:flutter/material.dart';
import 'package:mercury_js/mercury_js.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MercuryJS Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MercuryJSDemo(),
    );
  }
}

class MercuryJSDemo extends StatefulWidget {
  @override
  _MercuryJSDemoState createState() => _MercuryJSDemoState();
}

class _MercuryJSDemoState extends State<MercuryJSDemo> {
  late MercuryController _mercuryController;
  String _result = '';

  @override
  void initState() {
    super.initState();
    _mercuryController = MercuryController();
    
    // 运行JavaScript代码
    _mercuryController.evaluateJavascript("""
      (function() {
        return 'Hello from JavaScript!';
      })();
    """).then((result) {
      setState(() {
        _result = result;
      });
    }).catchError((error) {
      print('Error evaluating JavaScript: $error');
    });
  }

  @override
  void dispose() {
    _mercuryController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MercuryJS Demo'),
      ),
      body: Center(
        child: Text('JavaScript Result: $_result'),
      ),
    );
  }
}

解释

  1. 依赖管理:在pubspec.yaml中添加mercury_js依赖。
  2. 权限配置:如果需要,在AndroidManifest.xml中添加必要的权限。
  3. 使用MercuryJS
    • 创建一个MercuryController实例。
    • 使用evaluateJavascript方法运行JavaScript代码,并处理结果或错误。
    • 在UI中显示JavaScript代码返回的结果。

注意事项

  • 确保JavaScript代码是安全的,避免执行不受信任的脚本。
  • 根据需要管理MercuryController的生命周期,例如在组件销毁时调用dispose方法。

这样,你就可以在Flutter应用中集成并使用MercuryJS插件来运行JavaScript代码了。

回到顶部