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

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

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

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

ラジオボタン

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

Dart

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

Q&A

解決済

1回答

1094閲覧

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

hitonihiki

総合スコア4

Flutter

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

ラジオボタン

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

Dart

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

0グッド

0クリップ

投稿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 に疎いので解決方法が分かりません。
手助けお願いします。

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

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

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

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

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

guest

回答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

総合スコア1667

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

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

hitonihiki

2022/10/12 02:27

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

2022/10/12 03:56

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問