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

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

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

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

Dart

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

Q&A

解決済

2回答

1681閲覧

Dart/Flutterにおいて、build widget内でデータをネストしたfor文で回して利用する方法

neoz

総合スコア31

Flutter

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

Dart

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

0グッド

0クリップ

投稿2020/09/15 09:04

編集2020/09/15 09:34

Flutterで以下のallDataを、build widget内でネストしたfor文を用いて、利用しようとしています。

Dart

1// allData 2 3var allData = [ 4 { 5 'key': '2020-09-11=17:25:57:351', 6 'name': 'Jim', 7 'data': { 8 'weight': [ 9 { 10 'dateTime': '2020, 8, 25', 11 'value': 1450, 12 }, 13 { 14 'dateTime': '2020, 8, 26', 15 'value': 1890, 16 }, 17 ], 18 } 19 }, 20]

目指していることは、データにある各weightのvalueを、DataPoint内のvalueにそれぞれ受け渡して利用することです。

ここで問題が2つあります。

  1. 現状の以下のコードをそのまま実行すると、type 'int' is not a subtype of type 'double'と言われます。(doubleの型指定は見当たらないのですが)

Dart

1// コード 2 3 Widget build(BuildContext context) { 4 name = widget.name; 5 allCData = widget.allData; 6 7 for (var i = 0; i < allData.length; i++) { 8 if (allData[i]['name'] == name) { 9 for (var j = 0; j < allData[i]['data']['weight'].length; j++) { 10 dynamic eachWeight = allData[i]['data']['weight'][j]['value']; 11 print(eachWeight); // 1450とだけ返します 12 dynamic data = [ 13 DataPoint<DateTime>( 14 value: eachWeight, xAxis: DateTime(2020, 8, 24)), 15 // eachWeightのところに1450とハードコーディングすれば、正常に動きます。 16 ]; 17 18 19 return Scaffold( 20 appBar: AppBar( 21 22 // dataはこの下の方でも使います。

2.eachWeightをprintすると、1450のみがconsoleに出力されます。
もしかすると上記の書き方では、うまく全ての変数を取り出して利用できないのでしょうか?
その場合、どのように書き直せば良いでしょうか。

  jのfor文をforEachで書いた場合、以下のように言われます。
A build function returned null.

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

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

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

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

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

guest

回答2

0

ベストアンサー

複雑すぎてやりたいことがよく分からないので、以下のコードを参考にもう少し考えてみてください。

dart

1 2var allData = [ 3 { 4 'key': '2020-09-11=17:25:57:351', 5 'name': 'Jim', 6 'data': { 7 'weight': [ 8 { 9 'dateTime': '2020, 8, 25', 10 'value': 1450, 11 }, 12 { 13 'dateTime': '2020, 8, 26', 14 'value': 1890, 15 }, 16 ], 17 } 18 }, 19]; 20 21class Example extends StatefulWidget { 22 final String name; 23 24 const Example({Key key, this.name}) : super(key: key); 25 26 27 _ExampleState createState() => _ExampleState(); 28} 29 30class _ExampleState extends State<Example> { 31 final List<DataPoint<DateTime>> data = []; 32 33 34 void initState() { 35 super.initState(); 36 37 for (int i = 0; i < allData.length; i++) { 38 if (allData[i]['name'] != widget.name) break; 39 40 final weightData = (allData[i]['data'] as Map<String, List>)['weight']; 41 for (int j = 0; j < weightData.length; j++) { 42 data.add( 43 DataPoint<DateTime>( 44 value: weightData[j]['value'], 45 xAxis: DateTime(2020, 8, 24), 46 ), 47 ); 48 } 49 } 50 data.forEach(print); 51 } 52 53 54 Widget build(BuildContext context) { 55 return Scaffold( 56 body: Center( 57 child: Text('${data[0].value}'), 58 ), 59 ); 60 } 61}

投稿2020/09/15 11:53

nskhei

総合スコア704

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

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

neoz

2020/09/16 01:22

ありがとうございます。頂いたコードで、目指すことはわかりました!ただ、initState()内でprint(data)を実行してみると、初期の空リストが出力されてしまいます。 '${data[0].value}'の部分も、 RangeError (index): Invalid value: Valid value range is empty: 0 と出ておりました。 また、data.forEach(print)の部分でなぜprintができるのでしょうか。
nskhei

2020/09/16 02:50

このコードを試しているのであれば、呼び出し側で Example(name: ‘Jim’) のように、名前を渡しているか確認お願いします。 あと、 data.forEach(print) は、 data.forEach((x) => print(x)) の省略構文です。
neoz

2020/09/16 08:10

ありがとうございます、変数名が間違っていたようで、データは受けられる様になったと思います。 ただ、今度はtype 'int' is not a subtype of type 'double'と言われます。 value: double.parse(weightData[j]['value'])と変換してみても同じ結果になります。 合わせて、forEachのご説明もありがとうございます。 ただ、このエラーのため、printの結果も表示されていないようです。
nskhei

2020/09/16 08:19

可能であれば、Widgetのコード全体を貼ってもらえないでしょうか
nskhei

2020/09/16 08:28

あと、一応これも試してみてください。 value: weightData[j]['value'].toDouble(),
toast-uz

2020/09/16 09:52

当初の質問と別の問題が発生したのであれば、新たに質問をすることをお勧めします。
neoz

2020/09/16 10:13

ありがとうございます、後者のやり方だとparseできました! ただ、今度はstringを日付に変えようとするとうまく行かず、ご指摘の通り他の質問として再度投稿させていただきます。
guest

0

for文があっても、return Scaffold でループを抜けて build は終了します。

buildの中で複雑な構文は作れません。buildの外でビューに必要な要素を組み立てて、setStateを使ってbuildを呼び出し、buildの中は単純な構文のみを使ってビューの組み立てに集中しましょう。

投稿2020/09/15 11:10

toast-uz

総合スコア3266

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

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

neoz

2020/09/15 11:23

ありがとうございます。 そうすると、今回のケースのようにfor文でdataを回して、順次それぞれのvalueをbuild内で使いたい場合、どのようにすれば良いのでしょうか? buildの前でfor文を閉じてしまうと、中の変数が使えなそうです。
toast-uz

2020/09/15 11:30

中の変数も全てbuildの前で処理する必要があります。
neoz

2020/09/15 11:54

今回の場合、具体的にどのようにすれば良いのでしょうか。Dartの規則に慣れておらず恐縮です。
toast-uz

2020/09/15 12:21

DartというよりもFlutterですね。下に回答いただいたコードが、私の言いたいことを表しています。
neoz

2020/09/16 01:16

わかりました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問