Flutter Web 与原生交互 相关

230 阅读2分钟

完整的 Flutter Web 应用示例,展示如何让 Flutter 生成的 HTML 调用外部 JavaScript,以及外部 JavaScript 调用 Flutter 生成的 HTML 中的方法。

Flutter 调用外部 JavaScript

你可以使用 dart:js 或 dart:js_interop 库与外部 JavaScript 交互。

Flutter 示例代码

import 'dart:html'; // 用于 DOM 操作
import 'dart:js'; // 用于调用外部 JS
import 'package:flutter/material.dart';
void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text("Flutter 与 JS 交互")),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () {
                  // 调用外部的 JavaScript 函数
                  context.callMethod('externalJsFunction', ['Hello from Flutter']);
                },
                child: const Text('调用外部 JS 函数'),
              ),
              ElevatedButton(
                onPressed: () {
                  // 将 Dart 方法暴露给外部 JS 调用
                  context['flutterJsFunction'] = (String message) {
                    window.alert('来自外部的消息: $message');
                  };
                },
                child: const Text('暴露 Flutter 方法给外部'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

HTML 文件

运行 Flutter Web 时,index.html 是主 HTML 文件。这里我们需要在其中定义外部的 JavaScript 函数。

示例 index.html

<!DOCTYPE html>
<html>
  <head>
    <title>Flutter 与 JavaScript 交互</title>
    <script>
      // 定义外部 JS 函数
      function externalJsFunction(message) {
        console.log("Flutter 调用了 JS:", message);
        alert("Flutter 调用了外部 JS: " + message);
        // 调用 Flutter 暴露的方法
        if (window.flutterJsFunction) {
          window.flutterJsFunction("Hello back from JavaScript!");
        }
      }
    </script>
  </head>
  <body>
    <script src="main.dart.js"></script>
  </body>
</html>

运行后的交互逻辑

  1. Flutter 调用外部 JS

• 点击 “调用外部 JS 函数” 按钮。

• Flutter 会调用 externalJsFunction,浏览器会弹出一条消息,并在控制台打印日志。

  1. 外部 JS 调用 Flutter

• 点击 “暴露 Flutter 方法给外部” 按钮。

• 调用 externalJsFunction 后,外部 JS 会调用暴露的 flutterJsFunction,浏览器会弹出另一条消息。

关键点

  1. dart:js dart:html 是互补的

• dart:js 用于调用 JS 方法。

• dart:html 用于操作 DOM。

  1. 安全性注意

• 确保调用的 JS 代码是可信的,避免引入 XSS 漏洞。

  1. Debug 技巧

• 使用浏览器的开发者工具查看 console.log 输出,调试 JS 和 Dart 的交互问题。

更多详情可以参考 Flutter Web 官方文档