2012-11-08 66 views

Trả lời

8

Có một vài điều bạn có thể đạt được với Mirrors.

Dưới đây là một ví dụ làm thế nào để thiết lập giá trị của các tầng lớp và làm thế nào để gọi các phương thức tự động:

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", []); 
} 

Trong trường hợp bạn tự hỏi, im là một InstanceMirror, mà về cơ bản phản ánh dụ page.

Ngoài ra còn có một câu hỏi khác: Is there a way to dynamically call a method or set an instance variable in a class in Dart?

6

Bạn có thể sử dụng Dart Mirror API để thực hiện việc đó. Gương API không được thực hiện đầy đủ bây giờ nhưng dưới đây là cách nó có thể làm việc:

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

Cuộc gọi đến 'Futures.wait()' có ý nghĩa rất ít ở đây. Bạn có thể bỏ qua nó và kết quả là như nhau. 'Futures.wait()' trả về một 'Tương lai' hoàn thành khi các hành động đã cho hoàn thành, vì vậy, bạn thực sự phải viết một' .then() 'để làm cho nó hoạt động đúng. Tất nhiên nó bây giờ hoạt động bởi may mắn kể từ khi các hoạt động xảy ra được không async :) –

+0

Cảm ơn bạn đã bình luận của bạn. Tôi mới sử dụng trong tương lai và tôi đã nhầm lẫn với đề xuất 'await' www.dartbug.com/104 –

0

Bạn có thể sử dụng Serializable

Ví dụ:

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']}"); 
} 
Các vấn đề liên quan