【问题标题】:How to pass options to javascript function using dart:js?如何使用 dart:js 将选项传递给 javascript 函数?
【发布时间】:2021-01-30 00:51:26
【问题描述】:

我有以下功能性 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);
}

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

【问题讨论】:

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


    【解决方案1】:

    您应该单独定义您的对象,如下面的示例所示。原因是 javascript 对包括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 中找到代码。

    这是部署时的样子。

    【讨论】:

    • 谢谢,解决方案奏效了 :) 我欠你一杯啤酒?
    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2023-03-28
    • 1970-01-01
    • 2014-10-05
    • 2016-11-05
    相关资源
    最近更新 更多