use Jquery UI in Dart

2019-03-17 06:53发布

问题:

I'm trying to create a simple dialog in Dart and I thought it was easier to use existing javascript libraries. Here you can find the basic example, basically

$( "#dialog" ).dialog();

On internet and stackoverflow you can find 1000 examples but none works to me. I suppose this is the correct way:

import 'dart:js' as js;
//[...]
var jquery = new js.JsObject(js.context['jQuery']);
var myob = jquery('#dialog').dialog();

All I get is this error:

Breaking on exception: Class 'JsObject' has no instance method 'call'.

Have I misread Dart's documentation?

回答1:

Basically, there are 2 libraries to interop with js : dart:js and package:js. dart:js has been created after package:js and most of the stackoverflow answers use package:js and are still valid (it isn't worth to downvote these answers...)

package:js provides a simpler Api that comes at the cost of an increase of the js size (because package:js uses dart:mirrors and noSuchMethod).

With package:js :

import 'package:js/js.dart' as js;

main() {
  js.context.$("#dialog").dialog();
}

With dart:js :

import 'dart:js' as js;

main() {
  js.context.callMethod(r'$', ['#dialog']).callMethod('dialog');
}


回答2:

try:

context.callMethod(r'$', ['#dialog'])
       .callMethod('dialog', []);    


回答3:

You can need just to be notified on callback. There is quick fix:

class CallbackFunction implements Function {
  final Function f;
  CallbackFunction(this.f);
  call() => throw new StateError('There should always been at least 1 parameter'
  '(js this).');
  noSuchMethod(Invocation invocation) {
    Function.apply(f, []);
  }
}

.callMethod("spinner", [new js.JsObject.jsify({
    "stop": new js.JsFunction.withThis(new CallbackFunction(recalc),
    "page": 1,
    "step": 0.1
    })])

void recalc(){
   print("recalcing");
}

You can parse invocation argument to read javascript callback arguments. Source: 'package:js/js.dart':line 238 (may change)