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

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

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

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

Dart

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

Q&A

解決済

1回答

787閲覧

一度エラーが出てそのあと画面が表示されます

shin_tariu

総合スコア4

Flutter

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

Dart

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

0グッド

0クリップ

投稿2021/09/07 13:43

編集2021/09/07 13:49

dart

1import 'package:flutter/material.dart'; 2import 'package:flip_card/flip_card.dart'; 3import "package:http/http.dart" as http; 4import 'feedback_model.dart'; 5import 'package:google_sheet_db/feedback_model.dart'; 6import 'dart:convert' as convert; 7import 'package:google_sheet_db/background.dart'; 8import 'dart:math'; 9import 'package:flutter/cupertino.dart'; 10 11class WordsTestPage extends StatefulWidget { 12 13 State<WordsTestPage> createState() { 14 return _State(); 15 } 16} 17 18class _State extends State<WordsTestPage> { 19String E1 = ''; 20String J1 = ''; 21 22 // ignore: deprecated_member_use 23 List<FeedbackModel> feedbacks = List<FeedbackModel>(); 24 25 getFeedbackFromSheet() async { 26 var raw = await http.get( 27 "https://script.google.com/macros/s/...."); 28 29 var jsonFeedback = convert.jsonDecode(raw.body); 30 //print('this is json Feedback $jsonFeedback'); 31 32 // feedbacks = jsonFeedback.map((json) => FeedbackModel.fromJson(json)); 33 34 jsonFeedback.forEach((element) { 35 //print('$element THIS IS NEXT>>>>>>>'); 36 FeedbackModel feedbackModel = new FeedbackModel(); 37 feedbackModel.no = element['no']; 38 feedbackModel.name = element['name']; 39 feedbackModel.name2 = element['name2']; 40 41 42 feedbacks.add(feedbackModel); 43 }); 44 //print('${feedbacks[3]}'); 45 E1 = feedbacks[4].name; 46 J1 = feedbacks[4].name2; 47 print('$E1'); 48 print('$J1'); 49 50 if(mounted) { 51 setState(() {}); 52 } 53 } 54 55 56 void initState() { 57 getFeedbackFromSheet(); 58 super.initState(); 59 } 60 61 62 Widget build(BuildContext context) { 63 64 final list = nextNumbers(5, min: 1, max: feedbacks.length-1); 65 print(list); 66 int a = list[0]; 67 68 return Scaffold( 69 appBar: AppBar( 70 title: Text('単語テスト'), 71 ), 72 body: Stack( 73 children: [ 74 AppBackground(), 75 Column( 76 mainAxisAlignment: MainAxisAlignment.center, 77 children: <Widget>[ 78 FlipCard( 79 front: Card( 80 shape: RoundedRectangleBorder( 81 borderRadius: BorderRadius.circular(12), 82 ), 83 child: Container( 84 padding: EdgeInsets.all(15), 85 width: 400, 86 height: 60, 87 child: Column( 88 crossAxisAlignment: CrossAxisAlignment.start, 89 children: [ 90 Text( 91 feedbacks[a].name, 92 style: TextStyle( 93 fontSize: 20, 94 //fontWeight: FontWeight.bold, 95 ), 96 ), 97 ], 98 ), 99 ), 100 ), // カード前面に表示するWidget 101 back: Card( 102 shape: RoundedRectangleBorder( 103 borderRadius: BorderRadius.circular(12), 104 ), 105 child: Container( 106 padding: EdgeInsets.all(15), 107 width: 400, 108 height: 60, 109 child: Column( 110 crossAxisAlignment: CrossAxisAlignment.start, 111 children: [ 112 Text( 113 feedbacks[a].name2, 114 // J1.toString(), 115 style: TextStyle( 116 fontSize: 20, 117 //fontWeight: FontWeight.bold, 118 ), 119 ), 120 ], 121 ), 122 ), 123 ), // カード背面に表示するWidget 124 direction: FlipDirection.HORIZONTAL, // カード回転向き(HORIZONTAL:横<デフォルト>, VERTICAL:縦) 125 flipOnTouch: true, // タッチ可否(true:カード部タップで回転する<デフォルト>, false:タップしても回転しない) 126 speed: 500, // 回転スピード(500ミリ秒<デフォルト>) 127 onFlip: () {}, // タップイベント 128 onFlipDone: (isFront) {}, // タップイベント(前面かどうかbool値で判断できる) 129 ), 130 131 132 ], 133 134 ), 135 ], 136 ), 137 ); 138 } 139 140int nextNumber({int min, int max}) { 141 return min + Random().nextInt(max - min + 1); 142} 143 144 List<int> nextNumbers(int length, {int min, int max}) { 145 final numbers = Set<int>(); 146 147 while(numbers.length < length){ 148 final number = nextNumber(min: min, max: max); 149 numbers.add(number); 150 } 151 return List.of(numbers); 152 153 } 154 155} 156

◎現状
最終的には表示されるのですが
一度エラーが出て2秒後くらいに正しい画面が生成されます。
以下の写真を参照願います。
イメージ説明
イメージ説明
2回読み込まれているのかな、、、とも思います。
教えていただけたら助かります。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

手元で試せないので確実なことは分かりませんが、わかる範囲でお答えさせていただきます。

まずは、エラー文を読んでみましょう。

maxは0<max<2^32範囲じゃないといけないのに、-1でした(範囲外)。

つまり、maxが-1になっていることが原因だと言うことです。
(maxというのはおそらく、Random().nextInt()の後ろの()に入る値のことを指しています。是非コンソールに書かれているエラー文に目を通してみて下さい)

では次に、maxに関連する部分を見に行きます。
以下のコードが怪しいと思いました。

flutter

1final list = nextNumbers(5, min: 1, max: feedbacks.length-1); 2 3int nextNumber({int min, int max}) { 4 return min + Random().nextInt(max - min + 1); 5}

feedbacksはinitStateでapiの結果を待って、要素を追加してますよね。
実は、initStateで時間がかかる処理(apiの結果を待つのは時間がかかる処理の一つです)を行なっている場合、その実行完了を待たずしてbuildメソッドは走ってしまいます。
よって今回もinitStateでfeedbacksの追加が完了する前にbuildメソッドは処理を行なってしまい、max:feedbacks.length - 1;みたいなところで問題が起きるというわけです(まだリストには何も追加されていないのだから)
そして最終的に、nextNumberにて行われるRandom().nextInt(max - min + 1)でエラーが起きるというわけです。

ここから解決策です。
要は、feedbacksが追加されていないタイミングでbuild内の処理を行なっていたことが原因なので、それを防ぎましょう。

flutter

1 @override 2 Widget build(BuildContext context) { 3 //こちらを追加してください 4 if (feedbacks.isEmpty) { 5 return const Center(child: CircularProgressIndicator()); 6 } 7 // 8 final list = nextNumbers(5, min: 1, max: feedbacks.length-1); 9 .........(以下省略)

もしfeedbacksが空なら、適当なwidgetをreturnしています。
本当はFutureBuilderを使うのが適切な気がしますが、とりあえずこんな感じでfeedbacksが空なら次の処理に行かないようにしてみて下さい。

投稿2021/09/08 01:21

flutter_labo

総合スコア110

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

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

shin_tariu

2021/09/08 12:44

ありがとうございます。 さっそくやってみました!とてもいい感じになりました。 もっといろいろなスキルを教えていただきたいです!
flutter_labo

2021/09/09 03:39

解決したようで良かったです! 今後も時間があれば回答いたしますので、また質問していただければと思います(^_^)
shin_tariu

2021/09/09 03:48

ありがとうございます。 実はずっと悩んでる部分がありまして でも抽象的な内容で質問がしずらいんです。 もしお時間あって良ければ回答をお願いしたいのですが、、、 甘えてばかりですみません。 あなた様にだけ質問するって可能でしたっけ?
flutter_labo

2021/09/09 04:01

プログラミングしてるとそういう悩みってありますよね。 @flutter_likeというidでtwitterやってるんで、dmして頂ければ答えますよー。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問