Flutter web 跨域

在使用Flutter for Web开发过程中,遇到调用第三方API的跨域问题。文章分享了通过设置Chrome启动项、修改源代码及安装插件等尝试解决跨域的方法,最终采用dart中间件服务实现跨域调试。

最近在使用flutter for web开发项目,遇到了调用第三方api跨域的问题,由于不能够修改第三方服务器的同源策略。只能在本地寻找Flutter的跨域解决方案,找了很多文章,终于在yk3372大神的 https://juejin.im/post/5e5d1674e51d4526c1481991 方案中,实现了跨域调试。

Chrome虽然可以设置 --disable-web-security --user-data-dir 命令跨域启动,具体设置方式不再做赘述,但是我用的是VSCode,直接run起来的Chrome是没有跨域启动的,虽然我也尝试了去修改flutter根目录的Chrome.dart源文件,但是好像并没有起到什么效果。https://www.jianshu.com/p/a7e4dc5b61f6,具体设置方式在这片博客有介绍,我也尝试了yk3372所说的安装Chrome插件的方式,还是同样的问题,run起来的Chrome没有开启插件选项,同时也关闭了下图所示的各种launch选项,run起来依旧是没有插件可以选择,跨域模式也同样没有启动,按道理来说,设置Chrome的启动项是可以实现跨域模式启动,即使打开--disable-web-security这一选项依旧没有生效,目前还找不到原因,有知道的小伙伴可以下方留言交流探讨。

最终还是采用了 dart设置中间件服务的方式,实现了跨域调试。具体实现方式可以去 https://juejin.im/post/5e5d1674e51d4526c1481991  这里查看。

<think> 我们正在处理用户关于FlutterWeb交互的查询。根据提供的引用,我们可以总结出几种FlutterWeb交互的方法: 1. **MethodChannel(方法通道)**:这是Flutter与原生平台(Android/iOS)通信的标准方式。但若涉及Web,可能需要通过JavaScript作为中转(如引用[2]所示)。 2. **JavaScript交互**:在Web平台上,Flutter可以通过`dart:js`库调用JavaScript函数,反之亦然。引用[2]展示了Flutter调用JavaScript函数的示例。 3. **EventChannel(事件通道)**:用于持续的事件流通信,但引用中未直接提及在Web上的使用。 4. **使用第三方库(如flutter_inappwebview)**:引用[3]提到使用`flutter_inappwebview`库,该库提供了更强大的WebView功能,并支持FlutterWeb页面之间的通信。 根据引用内容,我们特别关注在Web平台上的交互: - **Flutter调用JavaScript**:使用`dart:js`库,例如: ```dart import 'dart:js' as js; // 调用全局JavaScript函数 var result = js.context.callMethod('getSearchData'); ``` - **JavaScript调用Flutter**:在Web平台上,可以通过注册Flutter函数为JavaScript可调用的函数。这通常使用`dart:js`库中的`allowInterop`或`allowInteropCaptureThis`函数将Dart函数包装成JavaScript函数。 另外,引用[3]提到的`flutter_inappwebview`库提供了一种通过WebView进行通信的方式。例如,在WebView中加载的网页可以通过JavaScript与Flutter代码通信。 ### 实现步骤 #### 1. Flutter调用JavaScript - 在Flutter代码中,使用`js.context.callMethod`调用全局JavaScript函数。 - 确保在Web页面上定义了相应的JavaScript函数。 #### 2. JavaScript调用Flutter - 使用`dart:js`将Dart函数暴露给JavaScript: ```dart // 定义一个Dart函数 void myDartFunction() { print('JavaScript调用了Dart函数!'); } // 将Dart函数暴露给JavaScript,使其成为全局可调用 js.context['myGlobalDartFunction'] = js.allowInterop(myDartFunction); ``` 然后在JavaScript中,可以直接调用`window.myGlobalDartFunction()`。 #### 3. 使用flutter_inappwebview(用于WebView内嵌网页的通信) - 在`pubspec.yaml`中添加依赖: ```yaml dependencies: flutter_inappwebview: ^6.0.0 ``` - 在Flutter中使用`InAppWebView`组件,并设置`javascriptEnabled: true`,然后通过`onWebViewCreated`事件获取WebViewController,使用`addJavaScriptHandler`注册可以被JavaScript调用的函数。 - 在Web页面中,使用`window.flutter_inappwebview.callHandler`来调用Flutter中注册的函数。 ### 代码示例 #### 示例1:Flutter调用JavaScript函数(Web平台) **Flutter端代码:** ```dart import 'dart:js' as js; void callJS() { // 调用名为'alertMessage'的JavaScript函数,并传递参数 js.context.callMethod('alertMessage', ['Hello from Flutter!']); } ``` **Web页面中的JavaScript代码:** ```javascript function alertMessage(message) { alert(message); } ``` #### 示例2:JavaScript调用Flutter函数(Web平台) **Flutter端代码:** ```dart import 'dart:js' as js; void setupExposedFunction() { // 将Dart函数暴露给JavaScript js.context['showMessage'] = js.allowInterop((String message) { print('JavaScript says: $message'); }); } ``` **Web页面中的JavaScript代码:** ```javascript // 调用Flutter暴露的函数 window.showMessage('Hello from JavaScript!'); ``` #### 示例3:使用flutter_inappwebview进行通信 **Flutter端代码:** ```dart import 'package:flutter_inappwebview/flutter_inappwebview.dart'; InAppWebView( initialData: InAppWebViewInitialData(data: """ <html><body> <button onclick="callFlutter()">Call Flutter</button> <script> function callFlutter() { window.flutter_inappwebview.callHandler('handlerName', 'Hello from WebView!'); } </script> </body></html> """), onWebViewCreated: (controller) { controller.addJavaScriptHandler( handlerName: 'handlerName', callback: (args) { print('Received from WebView: ${args[0]}'); return 'Hi from Flutter!'; }); }, ) ``` ### 注意事项 - 在Web平台上,Flutter与JavaScript的交互需要确保JavaScript代码在全局作用(window)上可用。 - 使用`flutter_inappwebview`时,注意版本和平台支持。 - 平台开发时,注意不同平台(Android, iOS, Web)的实现差异。 以上内容根据引用[1][2][3]整理,并提供了具体的实现方法和代码示例。 [^1]: Flutter学习之旅之Flutter和Android原生实现数据交互的MethodChanel和EventChannel方式的简单整理。 [^2]: 【FlutterFlutterWeb与Js交互。 [^3]: FlutterWeb通信,使用flutter_inappwebview库。 §§相关问题§§ 1. Flutter与原生平台(Android/iOS)交互和与Web交互有什么主要区别? 2. 如何在Flutter Web中处理问题? 3. 除了`flutter_inappwebview`,还有哪些第三方库支持FlutterWeb的交互? </think> ### FlutterWeb 交互的方法和实现 FlutterWeb 的交互主要通过以下三种方式实现,每种方式适用不同场景: --- #### 方法 1:**JavaScript 桥接(基础交互)** 通过 `dart:js` 库实现双向通信,适合轻量级交互: ```dart // Flutter 调用 JavaScript import 'dart:js' as js; void callJS() { // 调用全局 JS 函数 js.context.callMethod('showAlert', ['Hello from Flutter!']); } // JavaScript 调用 Flutter void exposeDartFunction() { js.context['onFlutterEvent'] = js.allowInterop((data) { print('JS 传递的数据: $data'); }); } ``` **Web 端 JavaScript 示例**: ```javascript // 被 Flutter 调用的函数 function showAlert(message) { alert(message); } // 调用 Flutter 暴露的函数 window.onFlutterEvent("Data from JS"); ``` --- #### 方法 2:**WebView 深度集成** 使用 **[flutter_inappwebview](https://pub.dev/packages/flutter_inappwebview)** 库实现复杂交互: ```dart InAppWebView( initialUrlRequest: URLRequest(url: Uri.parse("https://your-web-page")), onWebViewCreated: (controller) { // 注册 Flutter 方法供 JS 调用 controller.addJavaScriptHandler( handlerName: 'flutterHandler', callback: (args) { print('JS 调用参数: ${args[0]}'); return {'response': 'Flutter 已接收'}; }, ); }, onLoadStop: (controller, url) { // 调用 Web 中的 JS 函数 controller.evaluateJavascript(source: "window.postMessage('Flutter 消息')"); }, ) ``` **Web 端配合代码**: ```javascript // JS 调用 Flutter 方法 window.flutter_inappwebview.callHandler('flutterHandler', {key: 'value'}); // 接收 Flutter 消息 window.addEventListener('message', (event) => { console.log(event.data); }); ``` --- #### 方法 3:**MethodChannel + 原生层中转** 适合需要访问原生功能的场景(Android/iOS): ```dart // Flutter → 原生 → Web const channel = MethodChannel('com.example/bridge'); channel.invokeMethod('callJS', 'Flutter数据'); // 原生层 (Android 示例) webView.evaluateJavascript("receiveFromFlutter('" + data + "')", null); ``` --- ### 选择建议 | 场景 | 推荐方式 | 特点 | |-----------------------|------------------------|----------------------------------| | 轻量级通信 | JavaScript 桥接 | 无需依赖库,适合简单数据传递 | | 嵌入式 WebView 交互 | flutter_inappwebview | 功能最强大,支持双向实时通信 | | 需访问原生硬件 | MethodChannel 中转 | 兼容性好,适合平台复杂场景 | > 注意:Web 平台交互需在 `web/index.html` 中引入相关 JS 函数,并处理问题[^1][^2][^3]。 [^1]: Flutter 学习之旅 之 Flutter 和 Android 原生实现数据交互的简单整理。 [^2]: FlutterWeb 与 Js 交互需要 js 作为中转。 [^3]: FlutterWeb 通信推荐使用 flutter_inappwebview。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值