質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

2回答

466閲覧

[Flutter]listにデフォルトで追加しておく+一括で全てのidをリストに入れる方法がわからない

namihana

総合スコア23

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2020/03/30 17:31

現在作成中のアプリでCMを見ることによってコースが公開される機能を追加しようとしています。

現状、最初は全てロック状態、「CMを見る」をタップすると、タップしたコースのロックが解除される仕様です。

今回の質問は
・デフォルトでロックを解除されたものをリストにあらかじめ入れておく方法。
・全てを解除のボタンを押すと全てのコースをunlockedリストに一括で入れる方法。

が質問内容になります。

List<String> _unlockedIds = ['b1','b2','b3'];//idを指定して元からアンロックされているコースを作りたい List<String> 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

しかし、それだけだと_showDialog()のonPressed()でunlockedList.unlock(widget.course.id)が使えなかったため_showDialog()自体のウィジェットもConsumerで囲んでおります。

いまいちConsumerの使い方を理解できていない気がするので間違っていればアドバイスいただければ幸いです。

これについては値が変わったらリビルドしたいわけではなくて、単にUnlockedListを参照したいだけだと思うので、 Provider.of を使う方が適切だと思います。

以下のようにすることで、UnlockedListを取得することができます

final unlockedList = Provider.of<UnlockedList>(context, listen: false);

ダイアログ部分全体のコード

void _showDialog() { // flutter defined function showDialog( context: context, builder: (BuildContext context) { // return object of type Dialog final unlockedList = Provider.of<UnlockedList>(context, listen: false); return AlertDialog( title: Text("CMをみてロック解除!"), content: Text("500円で全てのロックを一括解除!"), actions: <Widget>[ // 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(); }, ), ], ); }, ); }

※ 自己解決されていますが、一部アドバイスできそうなところがあったので、参考までに回答しておきました。

投稿2020/04/02 20:56

popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namihana

2020/04/03 09:19

ご回答ありがとうございました!! Consumerの使い方に関しては解決できていなかったので、大変参考になりました。 ずっと疑問だったところだったのでありがたいです。。m(__)m
guest

0

自己解決

こちら自己解決いたしました。

load()のファンクションに['b1', 'b2', 'b3']; //デフォルトでロックが外れているコースをいれ、
一括で全てのidを入れる方法の質問は
別に例えば"unlockAll"などのキーワードを作り、それがlistにcotainされていれば全てのロックが解除されるようにロジックを書き直したことで実装可能になりました。

投稿2020/04/02 16:26

namihana

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問