【Flutter】ローカルJSONファイル読み込み（HTTP通信のテストをテストする時などに使う）

開発環境
⭐️Macbook Pro
⭐️Flutter
（Flutter 1.12.13+hotfix.7）
⭐️Android Stuido 3.5.3


↓↓ローカルJSONファイル読み込み　完成内容
<img width="406" alt="スクリーンショット 2020-02-16 17.47.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/e21773ad-f106-8e2c-749e-cc9586eed570.png">


1.Jsonファイルを用意する

「api_name.json」

```json:api_name.json
{
  "count": 5,
  "address": "Fukuoka",
  "main": null,
  "categorydata": [
    {
      "kapibara_id": "100",
      "kapibara_Name": "カピバラさん",
      "kapibara_Old": 10
    },
    {
      "kapibara_id": "101",
      "kapibara_Name": "ホワイトさん",
      "kapibara_Old": 20
    },
    {
      "kapibara_id": "102",
      "kapibara_Name": "仔カピバラさん",
      "kapibara_Old": 30
    },
    {
      "kapibara_id": "103",
      "kapibara_Name": "ひだまりさん",
      "kapibara_Old": 40
    },
    {
      "kapibara_id": "104",
      "kapibara_Name": "仔カピ兄",
      "kapibara_Old": 50
    },
    {
      "kapibara_id": "105",
      "kapibara_Name": "カピバラ105",
      "kapibara_Old": 60
    },
    {
      "kapibara_id": "106",
      "kapibara_Name": "カピバラ106",
      "kapibara_Old": 70
    }
  ]
}

```

2.JSONファイルをプロジェクタに配置する

json - api_name.json
<img width="693" alt="スクリーンショット 2020-02-16 17.56.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/b7755133-8a37-b3b2-75f6-ae00a8e726d8.png">

3.「pubspec.yaml」に「json」フォルダ配下を読みとる記述をする
<img width="888" alt="スクリーンショット 2020-02-16 17.58.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/722d120f-f3b0-0dad-167f-a856db048827.png">

```
  assets:
    - json/
```


```dart:main.dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:async';
import 'dart:convert';
import 'package:flutter/services.dart' show rootBundle;

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'non Local JSON Test"',
      theme: new ThemeData(
        primarySwatch: Colors.pink,
      ),
      home: new LocalJsonData(),
    );
  }
}


class LocalJsonData extends StatefulWidget {
  @override
  LocalJsonDataState createState() => new LocalJsonDataState();
}

class LocalJsonDataState extends State<LocalJsonData> {
  List _data; //データ


  /*
   * ローカルJSONファイル読み込みテスト用「api_name.json」
   */
  Future<String> _loadAVaultAsset() async {
    return await rootBundle.loadString('json/api_name.json');
  }

  /*
   * ローカルJSON　データセット
   */
  Future getLocalTestJSONData() async {
    String jsonString = await _loadAVaultAsset();
    setState(() {
      final jsonResponse = json.decode(jsonString);
      print("### getLocalTestJSONData:" + jsonResponse.toString());
      _data = jsonResponse['categorydata'];
    });
  }



  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("non JSON Test"),
      ),
      //Create a Listview and load the data when available
      body: ListView.builder(
          itemCount: _data == null ? 0 : _data.length,
          itemBuilder: (BuildContext context, int index) {
            return Container(
              child: Center(
                  child: Column(
                    // Stretch the cards in horizontal axis
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: <Widget>[
                      Card(
                        child: Container(
                          child: ListTile(
                            leading: null,
                            title: Text(
                                "kapibara_id:" + _data[index]['kapibara_id'].toString(),
                                style: TextStyle(
                                    fontSize: 20.0, color: Colors.amber[900])
                            ),
                            subtitle: Text(
                                "kapibara_Name:" + _data[index]['kapibara_Name'],
                                style: TextStyle(fontSize: 20.0, color: Colors.amber[900])
                            ),
                            onTap: () {
                              /* react to the tile being tapped */ },
                          ),
                          // added padding
                          padding: const EdgeInsets.all(15.0),
                        ),
                      )
                    ],
                  )),
            );
          }),
    );
  }

  @override
  void initState() {
    super.initState();

    //ローカルJSON
    this.getLocalTestJSONData();
  }

}


```