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

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

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

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

Dart

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

解決済

【Flutter】RadioListTileの値をElevatedbuttonタップ後に更新することはできますか?

my0930
my0930

総合スコア19

Flutter

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

Dart

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

1回答

0リアクション

0クリップ

132閲覧

投稿2022/10/01 06:43

編集2022/10/01 07:48

前提

RadioListTileで選択項目を選択し、その値をElevatedbuttonで
登録することができています。
登録成功後、snackBarを表示させることにしたのですが、
onpressedのlabel:【OK】ボタンはNavigator.of(context).pop();を設定しており、
連続で登録されると、snackBarも連続で出てしまいます。
画面が戻った先でも表示されてしまうので、
【OK】ボタンを押したらRadioListTileの選択項目がリセットできれば、
一回一回表示されないと考えました。

実現したいこと

RadioListTileの値が、Elevatedbutton押下後、nullに更新される。

該当のソースコード

main

class InstructionPage extends StatefulWidget { InstructionPage({Key? key, required this.users}) : super(key: key); DocumentSnapshot users; @override State<InstructionPage> createState() => _InstructionPageState(); } class _InstructionPageState extends State<InstructionPage> { String currentName = ""; @override Widget build(BuildContext context) { return ChangeNotifierProvider<WorkListModel>( create: (_) => WorkListModel()..fetchWorkList(), child: Scaffold( appBar: AppBar( title: Text("指示選択"), ), body: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Card( margin: const EdgeInsets.all(30), elevation: 8, shadowColor: Colors.black, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), child: Column( children: [ ListTile( leading: CircleAvatar( backgroundImage: NetworkImage(widget.users["imagePath"]), ), title: Text(widget.users["name"]), subtitle: Text(widget.users["status"].toString()), ), ], ), ), ChangeNotifierProvider<WorkListModel>( create: (_) => WorkListModel()..fetchWorkList(), child: SizedBox( height: 300, child: Center(child: Consumer<WorkListModel>(builder: (context, model, child) { final works = model.works; if (works == null) { return const CircularProgressIndicator(); } final List<Widget> widgets = works .map((workname) => RadioListTile<dynamic>( groupValue: currentName, title: Text(workname.name), value: workname.name, onChanged: (value) { setState(() { debugPrint('workname = $value'); currentName = value!; debugPrint('$currentName'); }); // model.setListTile(value); }, )) .toList(); return ListView(children: widgets); })), ), ), ChangeNotifierProvider<WorkListModel>( create: (_) => WorkListModel(), child: Container( child: Consumer<WorkListModel>( builder: ((context, model, child) { return ElevatedButton( child: const Text("決定"), onPressed: () async { if (currentName != "") { try { await model.addWork(currentName, widget.users["name"], widget.users["uid"]); await model.addHistory(currentName, widget.users["name"], widget.users["uid"]); model.resetWork(currentName); print("タップ後$currentName"); ScaffoldMessenger.of(context).showSnackBar(SnackBar( duration: const Duration(milliseconds: 500), behavior: SnackBarBehavior.floating, content: Text("指示が飛ばされました!"), action: SnackBarAction( label: "OK", onPressed: () async { print('SnackBarActionをクリックしました'); // Navigator.of(context).pop(); ScaffoldMessenger.of(context) .hideCurrentSnackBar(); }, ))); } catch (e) { print("$e==保存エラーです。"); const CircularProgressIndicator(); } } else { showDialog( context: context, builder: (context) { return AlertDialog( title: const Text("エラー"), content: const Text("指示する項目を選択してください"), actions: [ TextButton( onPressed: () { Navigator.of(context).pop(); }, child: const Text("OK")) ], ); }, ); } }, ); }), ), ), ) ], ), ), ); } }

model

import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/cupertino.dart'; import 'package:main/model/work.dart'; class WorkListModel extends ChangeNotifier { final _workCollection = FirebaseFirestore.instance.collection("work"); List<Work>? works; String? workerName; String? workName; bool? complite; int? manHour; int? phase; Timestamp? startTime; String? uid; String? documentId; Timestamp? endTime; void resetWork(String currentName) { currentName = ""; notifyListeners(); } void setListTile(String value) { String value = ""; notifyListeners(); } void fetchWorkList() async { final QuerySnapshot snapshot = await _workCollection.get(); final List<Work> works = snapshot.docs.map((DocumentSnapshot document) { Map<String, dynamic> data = document.data()! as Map<String, dynamic>; final String name = data["name"]; final int manHour = data["manHour"]; return Work(name: name, manHour: manHour); }).toList(); this.works = works; notifyListeners(); } Future addWork( String currentName, String workerName, String uid, ) async { switch (currentName) { case "掃除": manHour = int.parse("5"); break; case "ピッキング": manHour = int.parse("6"); break; case "プログラム": manHour = int.parse("5"); break; case "休憩": manHour = int.parse("1"); break; default: } final addNowWork = FirebaseFirestore.instance.collection("nowWork").doc(); addNowWork.set({ "complite": false, "manHour": manHour, "phase": 0, "workerName": workerName, "workName": currentName, "startTime": Timestamp.now(), "uid": uid, "documentId": addNowWork.id, }); } Future addHistory( String currentName, String workerName, String uid, ) async { final addworkHistory = FirebaseFirestore.instance.collection("work_history").doc(); addworkHistory.set({ "isComplite": false, "workerName": workerName, "workName": currentName, "startTime": Timestamp.now(), "uid": uid, "documentId": addworkHistory.id, "endTime": endTime, }); } }

試したこと

setResetメソッドを作ってみましたが
反映されず。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Flutter

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

Dart

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