 Flutterの記事を整理し本にしました
 Flutterの記事を整理し本にしました  
- 本稿の記事を含む様々な記事を体系的に整理し本にまとめました
- 今後はこちらを最新化するため、最新情報はこちらをご確認ください
- 10万文字を超える超大作になっています(笑)
はじめに
- この記事は、初めてのスマホアプリを作るまでの軌跡を残したものです。
- この記事では、stateless/statefulとshared_preferencesを用いたデータの保存を紹介します
関連記事
画面の再描画
- Dartでは、画面の再描画を行うか行わないかで、使うクラスが異なります。
- StatelessWidgetを継承するとbuildが一度しか呼ばれず、静的な(イミュータブルな?)ページになります
- StatefulWidgetとStateクラスを用いると、buildが繰り返し呼ばれ画面が再描画される動的な(ミュータブルな画面)になります。
 
- 公式ドキュメントを読むと、statelessもstatefulもどちらも不変オブジェクトと書かれています
- statelessは完全な不変オブジェクト
- statefulはStateクラスのジェネリクスにStatefulのクラスを指定することで利用します
- Stateクラスを継承したクラスのbuildが繰り返し呼ばれ、状態を保てます
 
 
stateless.dart
class Info extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("info"),
      ),
      body: Center(child: Text("使い方、更新情報など")),
    );
  }
}
stateful.dart
class Info extends StatefulWidget {
  @override
  _InfoState createState() => _InfoState();
  Widget build(BuildContext context) {
    return Info();
  }
}
class _InfoState extends State<Info> {
  String _value = "";
    return Scaffold(
      appBar: AppBar(
        title: Text("info"),
      ),
      body: Center(child: Text("使い方、更新情報など")),
    );
}
初期状態と状態の変え方
初期状態
- initStateメソッドが最初に呼び出されるので、ここを書き換えます
initState.dart
@Override 
void initState(){
  super.initState();
  //ここに独自の処理を入れる
}
状態の変更
- setStateメソッドで明示的に再描画させることができます
setState.dart
if (mounted) {
  setState(() {
    value = "変えたい値";
  });
}
- mountedをチェックしているのは、再描画のときに画面の構築が不完全な?な時がありエラーがでるので、ドキュメントにはmountedを調べてから書き換えるのを推奨としているためです。
データの保存
- 画面から入力された値を永続化するニーズはたくさんあると思います。
- DBに入れるなども解決策がありますが、手軽なshared_preferencesを使う例を紹介
 
sharedpref.dart
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString("key",value); // 登録
prefs.getString("key") // 取得
prefs.remove("key") // 削除
- pubspec.yamlのdependenciesにshared_preferencesを記述するのをお忘れなく
- アプリ内で共有されるので、別の画面からももちろん呼び出せます