見出し画像

【Flutter(フラッター)】状態管理はChangeNotifierProviderがいいらしい。実装してみたという話

最近は個人アプリ開発をしています。

Flutter(フラッター)というアプリのクロスプラットフォーム開発用のフレームワークみたいなやつを使って作業しています。

今回はFlutterでの状態管理のやり方の話です。

Flutterでは状態管理のやり方が複数あるみたいで、このProviderを使うやり方がよさげという話をネットでみたので実装してみました。

実装用のサンプルコードを作成したので、よかったらみてみてください。(語彙力よ・・・)

最近はyoutubeもちょいちょいやっているので、よかったらこちらも見て、チャンネル登録しておいてください。

と、いうわけで使い方を説明します。

1.providerというパッケージを入れる

pubspec.yamlというファイルを編集して、下記を追記します。

dependencies:
 provider: ^4.3.1

2.android studioにインストールします

Android Studioを利用して実行するには、下のほうにTerminalというのがあるので、そこをクリックして下記を実行します。

$ flutter pub get

3.main.dartファイルに下記を追加します

import 'package:provider/provider.dart';

以上でproviderというパッケージがAndroid Studioに認識されます。

続いて、providerパッケージの利用方法です。

1.providerを指定する

class MyApp extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   return MultiProvider( ←★ここらへん
     providers: [
       ChangeNotifierProvider(create: (context) => MainModel()),
     ],
     child: MaterialApp(
       title: 'Provider Demo',
       theme: ThemeData(
         // テーマカラー
         primarySwatch: Colors.blue,
         visualDensity: VisualDensity.adaptivePlatformDensity,
       ),
       initialRoute: '/',
       routes: {
         '/': (context) => MyHomePage(),
       },
     ),
   );
 }
}

MultiProviderで囲って、providersの中に

ChangeNotifierProvider(create: (context) => MainModel()),

を指定します。

※MultiProviderはproviderを複数指定する場合の書き方です。この書き方のほうがわかりやすかったし拡張性ありそうなのでMultiProvider利用してます。

MainModelはこちらが勝手に作ったmodel名です。

2、Consumerを指定する

 Widget build(BuildContext context) {
   return Scaffold(
       body: Consumer<MainModel>(builder: (context, model, child) { ←★ここらへん
         return Center(
           child: Column(
             children: [
               Text(model.todoList[0]["name"]), ←★ここらへん
               RaisedButton(
                 child: Text('追加'),
                 onPressed: () {
                   // ここでなにか
                   if(model.todoList.length == 1) {
                     model.addTask({"name": "追加したよ"});
                   }
                 },
               ),
             ],
           ),
         );
       })
   );
Consumer<MainModel>(builder: (context, model, child) {

上記の箇所は固定の書き方で、MainModelだけ自身が作成したものを指定します。

model.todoList[0]["name"]

MainModelの内容がmodelに入ってくるので、model.xxxxxとしていしてMainModelを利用します。

または、MainModelにある関数を利用したい場合は下記です。

model.addTask({"name": "追加したよ"});

ちなみに、MainModelはこんな感じです。

import 'package:flutter/material.dart';

class MainModel extends ChangeNotifier {
 List<Map> todoList = [{"name": "テスト"}];

 void addTask(Map item) {
   todoList.add(item);
   notifyListeners(); // 変更を通知するために必要
 }

 void changeTask(int index ,String item) {
   todoList[index]["name"] = item;
   notifyListeners();
 }

 void removeTask(int index) {
   todoList.removeAt(index);
   notifyListeners();
 }

 String getTaskName(int index) {
   return todoList[index]["name"];
 }

}

といった感じで利用できるはずです。

以上です。

ではまた。よい1日を。

Flutterの画面遷移の方法はこちらです。

https://note.com/imesto/n/na760d591855d

この記事が気に入ったらサポートをしてみませんか?