2013-04-15 11 views
9

konwertowane ładowarka tło obrazu JavaScript do dart, trochę tak: Javascript image loaderJak mogę łańcucha wiele zdarzeń obciążenia ImageElement w Dart

I użyć timera, aby sprawdzić, czy obrazy są ładowane. To działa OK.

Ale w Dart istnieją chainable Futures i zastanawiałem się, gdybyś mógł łańcuch ładowanie tła ImageElements ...

ImageElement a = new ImageElement(); 
ImageElement b = new ImageElement(); 
ImageElement c = new ImageElement(); 

Future.wait([a.src='a.jpg', b.src='b.jpg', c.src='ca.jpg']) 
    .then((List responses) => chooseBestResponse(responses)) 
    .catchError((e) => handleError(e)); 

oczywiście przypisywania src i rzeczywisty obraz jest asynchroniczne ładowanie tak to won” t praca ...

Potrzebuję również kodu do wykonania dla każdego obrazu po jego załadowaniu.

Może muszę napisać własną klasę FutureImageElement, ale pomyślałem, że najpierw zapytać ...

Jakieś pomysły?

Odpowiedz

24

Oczywiście, można korzystać z przyszłości. Wystarczy użyć właściwości first strumieni:

var a = new ImageElement(src: 'a.png'); 
var b = new ImageElement(src: 'b.png'); 
var c = new ImageElement(src: 'c.png'); 

var futures = [a.onLoad.first, b.onLoad.first, c.onLoad.first]; 

Future.wait(futures).then((_) => print('done')); 

Tekst „zrobione” będzie wydrukowany, gdy wszystkie trzy obrazy są ładowane.

0

Czy naprawdę potrzebujesz pracować z Futures?

Może coś takiego:

List<String> files = ["a", "b", "c"]; 
int imagesToLoad = files.length; 
for (String fileName in files) { 
    ImageElement pic = new ImageElement() 
     ..src = "$fileName.jpg" 
     ..onLoad.listen((Event e) { 
      // do something when the file has finished loading 

      imagesToLoad--; 
      if (imagesToLoad == 0) { 
      // do something when all images have loaded 
      } 
     }) 
    ; 
} 
+1

To jest dobre rozwiązanie, ale zastanawiam się, czy istnieje sposób Dart "Future" również. Zauważyłem, że onLoad zwraca EventStreamProvider. Zastanawiam się, czy mogę to jakoś wykorzystać. Czuję, że to może nauczyć mnie zaawansowanego zastosowania w przyszłości i podejrzewam, że jest to możliwe. –

Powiązane problemy