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

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

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

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

Dart

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

Q&A

解決済

1回答

1872閲覧

Flutterでjsonから得て作ったmap配列をドロップダウンボタンにしたい

Yariii

総合スコア61

Flutter

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

Dart

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

0グッド

0クリップ

投稿2020/11/02 17:05

作った配列でドロップダウンボタンを作りたいですが、エラーが出ます。
以下コードです。

jsonから年収リストを取ります。

"income": 10,

というようなパラメーターで整数だけが返ってきて、

10(200万未満),20(200万~400万),30(400万~600万),40(600万~800万),50(800万~1,000万),60(1,000万~1,500万),70(1,500万~2,000万),80(2,000万~3,000万),90(3,000万~4,000万),100(4,000万~5,000万),110(5,000万以上)

↑のように整数に文字列を紐づけないといけず、フロント側でmapに変換しなければなりません。
Futureでjsonから得た整数を使って、文字列を取り出して、ドロップダウンに使うイメージです。

dart

1 2///フロント側でmapに変換 3_incomeList = { 4 0: '未選択', 5 10: '(200万未満)', 6 20: '(200万~400万)', 7 30: '(400万~600万)', 8 40: '(600万~800万)', 9 50: '(800万~1,000万)', 10 60: '(1,000万~1,500万)', 11 70: '(1,500万~2,000万)', 12 80: '(2,000万~3,000万)', 13 90: '(3,000万~4,000万)', 14 100: '(4,000万~5,000万)', 15 110: '(5,000万以上)', 16 }; 17 18///jsonの整数レスポンスが入る。これをキーとして使う。 19int _income; 20 21Future _loadYourIncome() async { 22 final completer = Completer<void>(); 23 await ApiUser.get().then((response) { 24 final jsonData = json.decode(utf8.decode(response.bodyBytes)); 25 26 setState(() { 27 ///incomeに代入 28 ///nullで返ってくる場合もあり、その時は0を代入、「未選択」にする 29 if (jsonData["income"] == null) { 30 print('nullなので0代入'); 31 _income = 0; 32 } else { 33 print('nullじゃないのでそのまま代入'); 34 _income = jsonData["income"]; 35 } 36 }); 37 completer.complete(); 38 }).catchError((e) { 39 debugPrint('Error' + e.toString()); 40 completer.complete(); 41 }); 42 } 43 44 45 void initState() { 46 super.initState(); 47 _loadYourIncome().then((value) => setState(() {})); 48 } 49 50 51 void setState(Function fn) { 52 if (_alreadyDisposed) return; 53 super.setState(fn); 54 } 55 56 57 void dispose() { 58 _alreadyDisposed = true; 59 super.dispose(); 60 } 61

以上を踏まえて、ドロップダウンは以下のように作りました。

dart

1DropdownButton<String> _button = DropdownButton<String>( 2 value: _incomeList[_income], 3 items: _incomeList.entries 4 .map<DropdownMenuItem<String>>((MapEntry<int, String> e) { 5 return DropdownMenuItem<String>( 6 value: "${e.key}", 7 child: Text(e.value), 8 ); 9 }).toList(), 10 onChanged: (String newValue) { 11 setState(() { 12 _income = int.parse(newValue); 13 print(_incomeChecked); 14 // print(newValue); 15 }); 16 }, 17 );

しかし現状今のままビルドすると、
イメージ説明
のエラーが出ます。

以上になります。
このエラーの原因はなんでしょうか?解決策があれば、教えていただければ幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの意味は「DropdownButtonitem.valueとして選択された"未選択"が、存在しないor2つ以上あります」ということです。

以下の部分で、DropdownButtonitem.valueを、"${e.key}"というようにmapのkey部分で定義しているにも関わらず、選択をvalue: _incomeList[_income],と、mapのvalue部分("未選択")としているため、エラーが発生しました。この場合、mapのkey部分の文字列"0"を選択する必要があります。

よって、value: _incomeList[_income],value: "$_income",にすると、正常に動きます。

Dart

1DropdownButton<String> _button = DropdownButton<String>( 2 value: _incomeList[_income], 3 items: _incomeList.entries 4 .map<DropdownMenuItem<String>>((MapEntry<int, String> e) { 5 return DropdownMenuItem<String>( 6 value: "${e.key}", 7 child: Text(e.value), 8 ); 9 }).toList(),

投稿2020/11/02 23:50

toast-uz

総合スコア3266

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

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

Yariii

2020/11/03 03:56

ありがとうございます。動きました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問