質問: ['b1','b2','b3'];//idを指定して元からアンロックされているコースを作りたい List get ids => _unlockedIds; UnlockedList() { load(); } ``` 上記のようにidである、b1,b2,b3をリストにあらかじめ入れてみたのですが、シミュレータ上では一瞬解除されたように表示され再びロック状態になってしまいます。 ``` //全てのidをアンロックしたい void unlockAll(String id) { _unlockedIds.add(id); save(); notifyListeners(); } ``` unlockAllという機能は作っておりますが、一括で全てのidを取得する方法が分からずに困っています。 一括でidを取得するよりもっと良い方法があるかもしれませんが、、、 ちなみに今回course_card.dartというファイルの_showDialog()にアンロックボタンを入れているので、そのCardウィジェット自体をConsumerで囲んでおります。 (アンロック時にカード自体がリビルドされなければならないため) しかし、それだけだと_showDialog()のonPressed()でunlockedList.unlock(widget.course.id)が使えなかったため_showDialog()自体のウィジェットもConsumerで囲んでおります。 いまいちConsumerの使い方を理解できていない気がするので間違っていればアドバイスいただければ幸いです。 初心者で初めて、手探りでアプリを作成しておりますので基礎的なところがわかっていないかと思いますがどうか教えていただけると幸いです。m(__)m よろしくお願いいたします。 Githubでソースを公開しておりますので、一度確認いただければと思います。 https://github.com/nannantown/flutter_lang
回答: > > しかし、それだけだと_showDialog()のonPressed()でunlockedList.unlock(widget.course.id)が使えなかったため_showDialog()自体のウィジェットもConsumerで囲んでおります。 > > > いまいちConsumerの使い方を理解できていない気がするので間違っていればアドバイスいただければ幸いです。 > > > これについては値が変わったらリビルドしたいわけではなくて、単にUnlockedListを参照したいだけだと思うので、 `Provider.of` を使う方が適切だと思います。 以下のようにすることで、UnlockedListを取得することができます ``` final unlockedList = Provider.of(context, listen: false); ``` ダイアログ部分全体のコード ``` void _showDialog() { // flutter defined function showDialog( context: context, builder: (BuildContext context) { // return object of type Dialog final unlockedList = Provider.of(context, listen: false); return AlertDialog( title: Text("CMをみてロック解除!"), content: Text("500円で全てのロックを一括解除!"), actions: [ // usually buttons at the bottom of the dialog FlatButton( child: Text("CMを見る"), onPressed: () { unlockedList.unlock(widget.course.id); print(unlockedList.isUnlocked(widget.course.id)); Navigator.of(context).pop(); }, ), FlatButton( child: Text("ロック一括解除"), onPressed: () { unlockedList.unlockAll(); Navigator.of(context).pop(); }, ), FlatButton( child: Text("全てロックに戻す"), onPressed: () { unlockedList.clear(); Navigator.of(context).pop(); }, ), ], ); }, ); } ``` ※ 自己解決されていますが、一部アドバイスできそうなところがあったので、参考までに回答しておきました。