1. ホーム
  2. dart

[解決済み] FlutterアプリにJSONアセットを読み込むには?

2023-07-17 18:59:04

質問

FlutterアプリにJSONアセットを読み込むにはどうしたらよいでしょうか?

私の pubspec.yaml ファイルには次のようなものがあります。

assets:
    - assets/data.json

データを読み込もうとすると、ずっと引っかかります。試してみました。

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

でも、エラーが出ます。

引数の型 'Future< String>' は、パラメータの型 'String' に割り当てることができません。

どのように解決するのですか?

アレクサンドル・ボーデ(Alexandre Beaudet 's 答え は正しいのですが、何が起こっているのかについて多くの文脈を与えていません。

を呼び出しているとき loadString を呼び出しているとき、それは実際には非同期メソッド呼び出しです。このメソッドは Future<value> ではなく、単に value . これは、すぐに String という結果を持つわけではなく、将来のある時点で持つようになることを意味します。

Dartで非同期性を扱うには、主に2つの方法があります。 asyncawait であり、もう一つは先物を直接使用することです。詳細は dart guide on Asynchronous Programming を参照してください。 .

もしあなたが future.then を直接使用する場合、通常の関数から(つまり initState などから)行うことができます。単にコールバックを指定し、コールバックの中で結果をどうするかを指定するだけです。

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

を使いたい場合は await を使いたい場合は、@Alexandre が示しているように、それを使う関数を async としてマークする必要があります。

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

関数をオーバーライドする場合(例えばinitState)、戻り値を変更しないことも確認する必要があります。これは、ほとんどの場合、dart 2 のタイピングによって捕捉されるはずですが、void -> Future はそうではないようです。

最後にもう一つ注意点があります。もしウィジェットを作るためにデータの結果を使用するのであれば、おそらく FutureBuilder .