5 votes

Comment lire tous les binaires d'une HttpRequest, en Dart ?

HttpRequest dans Dart, est un Stream<List<int>> comment obtenir le contenu binaire comme List<int> ?

J'ai essayé :

request.toList().then((data) {
    // but data is a List<List<int>> !!!
});

Il semble que je ne doive pas utiliser toList . Quelle est la méthode correcte que je dois utiliser ?

9voto

Anders Johnsen Points 616

Nous avons récemment ajouté un BytesBuilder disponible en dart:io . Voir ici pour plus d'informations.

Dans votre cas, le code pourrait ressembler à ceci :

request.fold(new BytesBuilder(), (builder, data) => builder..add(data))
    .then((builder) {
      var data = builder.takeBytes();
      // use data.
    });

L'avantage d'utiliser BytesBuilder est qu'il est optimisé pour les gros morceaux de données binaires. Notez que j'utilise takeBytes pour obtenir le tampon interne de la BytesBuilder en évitant une copie supplémentaire.

8voto

Kai Sellgren Points 8423

Une façon de le faire est de définir l'option onDone rappel pour listen() . Le callback est déclenché lorsque l'opération est terminée. Ensuite, il suffit de créer une liste d'entiers et de l'ajouter à chaque événement :

List<int> data = [];
request.listen(data.addAll, onDone: () {
  // `data` has here the entire contents.
});

Ou alors, voici une phrase toute simple :

request.reduce((p, e) => p..addAll(e)).then((data) {
  // `data` has here the entire contents.  
});

J'ajouterai également l'excellent conseil d'Anders Johnsen qui consiste à utiliser BytesBuilder que vous devriez préférer :

 request.fold(new BytesBuilder(), (b, d) => b..add(d)).then((builder) {
   var data = builder.takeBytes();
 });

2voto

Fox32 Points 5527

Si vous utilisez dart:html vous pouvez utiliser

HttpRequest.request('/blub.bin', responseType: 'arraybuffer').then((request) {

pour obtenir la réponse sous la forme d'un tableau tampon. Vous pouvez accéder à ce tampon via request.response . Mais pour accéder aux octets, il faut créer un fichier Uint8List représentation des données :

List<int> bytes = new Uint8List.view(request.response);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X