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

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

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

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

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

Dart

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

解決済

Flutter RadioListTile で画面更新がされない

hitonihiki
hitonihiki

総合スコア3

Flutter

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

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

Dart

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

1回答

0グッド

0クリップ

378閲覧

投稿2022/10/11 19:09

編集2022/10/11 19:10

実現したいこと

  • 前ページからの値を利用してラジオボタンを生成する(実現済み)
  • ラジオボタンが正常に動作する

発生している問題・エラーメッセージ

  • ラジオボタンを選択しても画面が更新されない(どのボタンも選択されていない表示のまま)
  • groupValue の値は変更されている様子(print で出力して確認済み)
  • エラーメッセージはなく、ラジオボタンの選択が画面に反映されていない状況

該当のソースコード

Dart

1import 'package:cloud_firestore/cloud_firestore.dart'; 2import 'package:firebase_auth/firebase_auth.dart'; 3import 'package:flutter/material.dart'; 4 5class CreateAnswerPage extends StatefulWidget { 6 const CreateAnswerPage({super.key}); 7 8 _CreateAnswerPageState createState() => _CreateAnswerPageState(); 9} 10 11class _CreateAnswerPageState extends State<CreateAnswerPage> { 12 13 Widget build(BuildContext context) { 14 List<String> argumentsFromCreatePage = 15 ModalRoute.of(context)?.settings.arguments as List<String>; 16 17 int questionNum = int.parse(argumentsFromCreatePage[0]); 18 int choiceNum = int.parse(argumentsFromCreatePage[1]); 19 20 // answerList[i] : i問目の答え 21 List<int> answerList = new List.generate(questionNum, (index) => 0); 22 // answerGroupValue[i] : i問目のgroupValue 23 List<int> answerGroupValue = new List.generate(questionNum, (index) => 0); 24 25 return Scaffold( 26 appBar: AppBar( 27 title: Text("mark sheet"), 28 ), 29 body: Center( 30 child: SingleChildScrollView( 31 child: Column( 32 children: <Widget>[ 33 Container( 34 child: Column( 35 children: <Widget>[ 36 for (int i = 0; i < questionNum; i++) ...{ 37 Container( 38 child: Row( 39 children: <Widget>[ 40 for (int j = 0; j < choiceNum; j++) ...{ 41 Expanded( 42 child: RadioListTile( 43 title: Text((j + 1).toString()), 44 value: j + 1, 45 groupValue: answerGroupValue[i], 46 onChanged: (value) { 47 setState(() { 48 answerGroupValue[i] = j + 1; 49 print(answerGroupValue[i]); 50 print(value); 51 }); 52 }, 53 ), 54 ), 55 } 56 ], 57 ), 58 ), 59 } 60 ], 61 ), 62 ), 63 // 作成完了ボタン 64 Container( 65 margin: EdgeInsets.all(5), 66 child: SizedBox( 67 width: 200, 68 height: 50, 69 child: ElevatedButton( 70 style: ElevatedButton.styleFrom( 71 shape: RoundedRectangleBorder( 72 borderRadius: BorderRadius.circular(12), 73 ), 74 ), 75 child: Text("作成完了"), 76 onPressed: () { 77 Navigator.pushNamed(context, "/home"); 78 }), 79 ), 80 ), 81 ], 82 ), 83 ), 84 ), 85 ); 86 } 87} 88 89

試したこと

  • List ではなく int の変数を groupValue に指定する

  groupValue の値は変更されているようだが、画面は更新されない

  • 外側を for 文ではなく ListView.builder で実装

  groupValue の値は変更されているようだが、画面は更新されない

  • for 文を使わず ListView.builder で実装

  エラーが出てラジオボタンが表示されない(今回のメインの問題とは関係なさそうなのでスルー)

おそらく動的にラジオボタンを生成することで何か問題が起きていると思うのですが、Flutter に疎いので解決方法が分かりません。
手助けお願いします。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

build内で変数の初期化をしているので、選択値が毎回0クリアされている。
変数を_CreateAnswerPageState の変数としてinitState内で初期化する。
これで_CreateAnswerPageStateのインスタンスが生成されたときに変数類が初期化され、その後インスタンスが破棄されるまで値は保持される。

dart

1class _CreateAnswerPageState extends State<CreateAnswerPage> { 2 // answerList[i] : i問目の答え 3 late List<int> answerList; 4 // answerGroupValue[i] : i問目のgroupValue 5 late List<int> answerGroupValue; 6 late int questionNum; 7 late int choiceNum; 8 9 10 void initState() { 11 super.initState(); 12 List<String> argumentsFromCreatePage = 13 ModalRoute.of(context)?.settings.arguments as List<String>; 14 15 questionNum = int.parse(argumentsFromCreatePage[0]); 16 choiceNum = int.parse(argumentsFromCreatePage[1]); 17 18 answerList = List.generate(questionNum, (index) => 0); 19 answerGroupValue = List.generate(questionNum, (index) => 0); 20 } 21 22 23 Widget build(BuildContext context) { 24 return Scaffold( 25 appBar: AppBar( 26 // 以降は一緒

投稿2022/10/11 23:25

ta.fu

総合スコア1263

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

hitonihiki

2022/10/12 02:27

回答ありがとうございます。 提示していただいたコードを実行したところ、エラーが起きてしまいました。 調べた結果、「initState 内で context を参照しようとしている」ことがエラーの原因でした。 この問題は initState ではなく didChangeDependenceis を使うことで解決しました。 ありがとうございました。
ta.fu

2022/10/12 03:56

contextが使えなかった件、間違った実装を載せてしまい、申し訳ありません。 取り合えず、解決してよかったです。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Flutter

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

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

Dart

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