web-dev-qa-db-fra.com

Comment écrire une instance `ByteData` dans un fichier dans Dart?

J'utilise Flutter pour charger un "actif" dans un File afin qu'une application native puisse y accéder.

Voici comment je charge l'actif:

final dbBytes = await rootBundle.load('assets/file');

Cela renvoie une instance de ByteData.

Comment puis-je écrire ceci à un Dart.io.File exemple?

10
Renato

ByteData est une abstraction pour:

Séquence d'octets d'accès aléatoire de longueur fixe qui fournit également un accès aléatoire et non aligné aux entiers de largeur fixe et aux nombres à virgule flottante représentés par ces octets.

Comme Gunter l'a mentionné dans les commentaires, vous pouvez utiliser File.writeAsBytes . Cela nécessite un peu de travail API pour passer de ByteData à un List<int>, pourtant.

import 'Dart:async';
import 'Dart:io';
import 'Dart:typed_data';

Future<void> writeToFile(ByteData data, String path) {
  final buffer = data.buffer;
  return new File(path).writeAsBytes(
      buffer.asUint8List(data.offsetInBytes, data.lengthInBytes));
}

J'ai également déposé un problème pour rendre les documents sur Flutter plus clairs pour ce cas d'utilisation.

17
matanlurey

pour rechercher flutter ByteData to List<int> puis trouvé ici, mais pas complètement répondre à ma question:

comment convertir ByteData en List<int>?

après auto-investigation, la solution est:

  1. utilisez .cast<int>()
ByteData audioByteData = await rootBundle.load(audioAssetsFullPath);
Uint8List audioUint8List = audioByteData.buffer.asUint8List(audioByteData.offsetInBytes, audioByteData.lengthInBytes);
List<int> audioListInt = audioUint8List.cast<int>();

ou 2. utilisez .map

ByteData audioByteData = await rootBundle.load(audioAssetsFullPath);
Uint8List audioUint8List = audioByteData.buffer.asUint8List(audioByteData.offsetInBytes, audioByteData.lengthInBytes);
List<int> audioListInt = audioUint8List.map((eachUint8) => eachUint8.toInt()).toList();
2
crifan