Dart中的动态类方法调用

15

就像在PHP中动态调用类方法的问题一样,我也想在Dart中实现这个功能。

var = "name";
page.${var} = value;
page.save();

可以的吗?

请务必勾选其中一个答案的绿色复选标记!它们都是正确的。 - Shannon -jj Behrens
3个回答

16

使用镜像可以实现多种功能。

以下是一个示例,演示如何动态设置类的值和调用方法:

import 'dart:mirrors';

class Page {
  var name;

  method() {
    print('called!');
  }
}

void main() {
  var page = new Page();

  var im = reflect(page);

  // Set values.
  im.setField("name", "some value").then((temp) => print(page.name));

  // Call methods.
  im.invoke("method", []);
}

如果您想知道,im 是一个InstanceMirror,它基本上反映了 page 实例。

还有另一个问题:在 Dart 中是否有一种动态调用类中方法或设置实例变量的方式?


6
有人知道如何在Flutter中实现这个吗?在Flutter中,我们无法导入dart:mirrors包 :/ - Kavinda Jayakody
1
Flutter禁止在Dart中使用镜像和HTML库,因为这会严重影响小部件重建时间。您可以在Flutter FAQ页面上了解更多信息。 - Stahp

7
你可以使用Dart镜像API来完成这样的操作。Mirror API现在没有完全实现,但这是它如何工作的方式:
import 'dart:mirrors';

class Page {
  String name;
}

main() {
  final page = new Page();
  var value = "value";

  InstanceMirror im = reflect(page);
  im.setField("name", value).then((_){
    print(page.name); // display "value"
  });
}

1
在这里调用Futures.wait()没有什么意义。您可以省略它,结果是相同的。Futures.wait()返回一个Future,当给定的操作完成时,该Future也会完成,因此,您真的必须编写.then()才能使其正常工作。当然,现在它运行是侥幸的,因为这些操作恰好是非异步的 :) - Kai Sellgren
感谢您的评论。我对Future的使用还很陌生,对于await提案也感到困惑。网址是www.dartbug.com/104。 - Alexandre Ardhuin

3
你可以使用Serializable
例如:
import 'package:serializable/serializable.dart';

@serializable
class Page extends _$PageSerializable {
  String name;
}

main() {
  final page = new Page();
  var attribute = "name";
  var value = "value";

  page["name"] = value;
  page[attribute] = value;

  print("page.name: ${page['name']}");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接