92 votes

Comment charger JSON actifs dans le Flottement de l'App

Comment puis-je charger un JSON actif dans mon Flutter application?

Mon pubspec.yaml le fichier est le suivant:

  assets:
    - assets/data.json

Je reçois coincé à essayer de charger les données. J'ai essayé

final json = JSON.decode(
    DefaultAssetBundle.of(context).loadString("assets/data.json")
);

Mais je reçois l'erreur

L'argument de type 'Avenir< String>' ne peut pas être attribuée au paramètre de type "String".

Merci!

101voto

Alexandre Beaudet Points 1708

Essayer :

String data = await DefaultAssetBundle.of(context).loadString("assets/data.json");
final jsonResult = json.decode(data);

47voto

rmtmckenzie Points 10854

@Alexandre Beaudet réponse est bonne, mais ne donne pas beaucoup de contexte sur ce qui se passe.

Lorsque vous appelez loadString, c'est en fait un appel de méthode asynchrone. Vous pouvez le dire, car il renvoie à un Future<value> plutôt que juste un value. Cela signifie qu'il n'est pas immédiatement à la suite de la Chaîne, mais à un certain moment dans l'avenir.

Il existe deux principales façons de traiter avec l'asynchronicité dans Dart; la première étant d'utiliser async et await, le second étant d'utiliser le terme directement. Voir la dart guide sur la Programmation Asynchrone.

Si vous utilisez future.then directement, vous pouvez le faire à partir d'une fonction normale (c'est à dire à partir de initState etc). Il vous suffit de spécifier le rappel, et dans le rappel de quoi faire avec le résultat.

void printDailyNewsDigest() {
  final future = gatherNewsReports();
  future.then((news) => print(news));
}

Si vous souhaitez utiliser await comme @Alexandre a illustré, vous devez marquer la fonction que vous utilisez, car async, c'est à dire:

Future<Void> printDailyNewsDigest() async {
  String news = await gatherNewsReports();
  print(news);
}

Si vous substituez une fonction (c'est à dire initState) vous devez également vous assurer de ne pas modifier la valeur de retour. Qui devrait se faire attraper par dart 2 en tapant la plupart du temps, mais nulle -> Avenir ne semble pas l'être.

Une dernière chose à noter - si vous utilisez le résultat de données afin de créer des widgets, vous aurez probablement envie de regarder à l'aide d'un FutureBuilder.

33voto

thundertrick Points 126

J'utilise la suite de parser json dans des actifs:

import 'dart:convert';
import 'package:flutter/services.dart' show rootBundle;
//...
Future<Map<String, dynamic>> parseJsonFromAssets(String assetsPath) async {
    print('--- Parse json from: $assetsPath');
    return rootBundle.loadString(assetsPath)
        .then((jsonStr) => jsonDecode(jsonStr));
  }

L'utilisation asynchrone:

parseJsonFromAssets(path)
    .then((dmap) => {
    // here you get json `dmap` as Map<String, dynamic>
    print(dmap);
}));

L'utilisation de la synchronisation:

Map<String, dynamic> dmap = await parseJsonFromAssets('assets/test.json');

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