flutter - 如何使用 dart :js? 将选项传递给 javascript 函数

标签 flutter dart flutter-web dart-js-interop

我有以下功能性 javascript 代码来演示我想要实现的目标。它应该输出传递给方法的对象,然后是属性“a”的值。

<!DOCTYPE html>
<html>
<head>
</head>
<body>
  <script>
    window.theObjectCall = function(x) {
      console.log(x);
      console.log(x.a);
    }
  </script>
  <script src="main.dart.js" type="application/javascript"></script>
</body>
</html>
我有以下 dart 代码,它可以工作,但是“a”无法按我的预期访问。
@JS('window')
library whatever;

import 'dart:js';

import 'package:js/js.dart';

@JS('theObjectCall') // Accessing method getCurrentPosition from Geolocation API
external void theJsObjectCall(JsObject theObject);

void someJsCallWithObject() {
  var object = JsObject(context['Object']);
  object['a'] = 'xxx';
  theJsObjectCall(object);
}

在控制台中执行以下日志“未定义”。
enter image description here

最佳答案

您应该单独定义您的对象,如下面的示例所示。原因是 javascript 对 Dart 类不透明,包括 JSObject .正如文档所暗示的那样,它只是一个代理,可让您访问 Dart 中的 js 对象属性。我不确定你是否可以使用它。
但是,如果您已经知道要传递的对象的结构,那么您可以使用该结构定义一个匿名类并将定义的 JS 函数传递给它。然后 dart2js 会适本地处理转换。

@JS('window')
library whatever;

import 'dart:js';

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

@JS('theObjectCall') // Accessing method getCurrentPosition from Geolocation API
external void theJsObjectCall(ObjectYouWantToSend theObject);

void someJsCallWithObject() {
  ObjectYouWantToSend oywts = ObjectYouWantToSend(a: 'xyz');
  theJsObjectCall(oywts);
}

@JS()
@anonymous
class ObjectYouWantToSend {
  external factory ObjectYouWantToSend({
    String a,
  });
  external String get a;
}

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          child: Center(
            child: FlatButton(
              onPressed: someJsCallWithObject,
              child: Text('Call The js Function.'),
            ),
          ),
        ),
      ),
    );
  }
}

你可以在我的 repo 中找到代码.
这是部署时的样子。
enter image description here

关于flutter - 如何使用 dart :js? 将选项传递给 javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64373231/

相关文章:

flutter - Flutter在具有不同背景颜色的静态行之间添加动态行表

dart - 单击时 Flutter 扩展磁贴消失

flutter - 如何在 Flutter Web 中创建一个 DOM 元素并使用 ID 声明它

ssl - 请使用 ssl 证书发送 https 请求

Flutter Web 和 SSR

flutter - 我在哪里可以找到 "print()"在 flutter web 中的结果?

flutter 忽略 header X-Firebase-Locale 因为它的值为空

flutter - 在堆栈和列中包装定位控件时出现 flutter 错误(一个RenderFlex被无限像素溢出)。

android - Flutter如何在圆圈中显示标记? flutter_map

dart - Flutter:检测键盘打开和关闭