Flutterでテキストファイルの出力と読み込み

引き続きFlutterの勉強中しています。
今回は、テキストファイルへの出力・読み込みを行うプログラムを作成してみました。

###やりたい事
1.テキストフィールドに任意の文字列を入力
2.「ファイルに出力する」ボタンを押して、テキストフィールドの内容をファイルに保存
3.「出力した内容を読み込む」ボタンを押して、出力したファイルを読み込む
4.「出力したファイルの内容は〇〇です！」の箇所に読み込んだ内容が表示される

###成果物
![circleanimationmuvie](https://media.giphy.com/media/BWQR9F3LnVYWj3yv99/giphy.gif)


###コード
```dart:pubsec.yaml
depencies:
  flutter:
    sdk: flutter

  path_provider: any
```


```dart:main.dart
//非同期処理用ライブラリ
import 'dart:async';
//ファイル出力用ライブラリ
import 'dart:io';

import 'package:flutter/material.dart';
//アプリがファイルを保存可能な場所を取得するライブラリ
import 'package:path_provider/path_provider.dart';

//テキストフィールドの状態を管理するためのクラス
final _textController = TextEditingController();
//出力するテキストファイル名
final _fileName = 'editTextField.txt';

void main() => runApp(MyApp());

//ステートレス
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter ファイル 出力テスト',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter ファイル 出力テスト'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

//ステートフル
class _MyHomePageState extends State<MyHomePage> {
  //読み込んだテキストファイルを出力
  String _out = '';

  //ファイルの出力処理
  void outButton() async {
    getFilePath().then((File file) {
      file.writeAsString(_textController.text);
    });
  }

  //ファイルの読み込みと変数への格納処理
  void loadButton() async {
    setState(() {
      load().then((String value) {
        setState(() {
          _out = value;
        });
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('テキストを入力してください'),
            Padding(
              padding: EdgeInsets.all(10.0),
              child: TextField(
                autofocus: true,
                controller: _textController,
                decoration: InputDecoration(icon: Icon(Icons.arrow_forward)),
              ),
            ),
            Padding(
              padding: EdgeInsets.all(10.0),
              //ファイル出力用のボタン(ボタン押下でoutButtonメソッドを呼び出し)
              child:RaisedButton(child: Text('ファイルに出力する'), onPressed: outButton),
            ),
            Padding(
              padding: EdgeInsets.all(10.0),
              //ファイル読み込み用のボタン(ボタン押下でloadButtonメソッドを呼び出し)
              child: RaisedButton(
                  child: Text('出力したファイルを読み込む'), onPressed: loadButton),
            ),
            Padding(
                padding: EdgeInsets.all(10.0),
                //読み込みだファイルの内容を表示
                child: Text(
                  '出力したファイルの内容は「' + _out + '」です！',
                )),
          ],
        ),
      ),
    );
  }
}

//テキストファイルを保存するパスを取得する
Future<File> getFilePath() async {
  final directory = await getTemporaryDirectory();
  return File(directory.path + '/' + _fileName);
}

//テキストファイルの読み込み
Future<String> load() async {
  final file = await getFilePath();
  return file.readAsString();
}
```

###補足

#####プラグインの読み込み
```dart:pubsec.yaml
depencies:
  flutter:
    sdk: flutter

  path_provider: any
```
`getTemporaryDirectory()`メソッドを使いたいので、`path_provider`プラグインを読み込んでます。

#####テキストファイルを保存するパスを取得する
```dart:main.dart
Future<File> getFilePath() async {
  final directory = await getTemporaryDirectory();
  return File(directory.path + '/' + _fileName);
}
```
「テキストファイルを保存するパス + ファイル名」を取得しています。
`getTemporaryDirectory()`で、アプリのファイルシステムに一時的な保存可能なパスを確保しています。


#####テキストファイルの読み込み
```dart:main.dart
Future<String> load() async {
  final file = await getFilePath();
  return file.readAsString();
}
```
`getFilePath()`で保存したテキストファイルのパスを取得。
`return file.readAsString();`ファイルの中身を返している。


#####テキストフィールドの内容をファイルに書き込み
```dart:main.dart
  void outButton() async {
    getFilePath().then((File file) {
      file.writeAsString(_textController.text);
    });
  }
```
`getFilePath()`で取得した保存したテキストファイルに対して、
`file.writeAsString`でテキストフィールドの内容(`_textController.text`)を書き込んでます。

#####ファイルの読み込み処理
```dart:main.dart
  void loadButton() async {
    setState(() {
      load().then((String value) {
        setState(() {
          _out = value;
        });
      });
    });
```
`load`でファイルの内容を読み込んで、
その内容を変数`_out`に出力しています。

#####ファイルの内容(変数)を表示
```dart:main.dart
            Padding(
                padding: EdgeInsets.all(10.0),
                //読み込みだファイルの内容を表示
                child: Text(
                  '出力したファイルの内容は「' + _out + '」です！',
                )),
```

##まとめ
テキストファイルだけじゃなくて、画像なんかもこの方法で保存したりできるみたいです。
ちょっとずつですが、Flutterがわかってきて楽しくなってきている今日この頃・・・