前提
Flutter で選択した項目を登録する機能を作っています。
やり方がわからないので質問させてください。
ひとつのページにproviderとfirebaseを用いて
データ取得と追加をしている途中です。
modelをつくっており、イニシャライズもしています。
実現したいこと
RadioListTileでWorkListから入っているデータをとってきて状態管理していて
その選択した項目をElevatedbuttonでfirebaseにaddしたいです。
発生している問題・エラーメッセージ
ラジオリストのvalueの変数をElevatedbutton内のConsumerウィジェットに入れられない。
_currentnameがnullになってしまう。
該当のソースコード
model
1import 'package:cloud_firestore/cloud_firestore.dart'; 2import 'package:flutter/foundation.dart'; 3import 'package:main/model/history.dart'; 4import 'package:provider/provider.dart'; 5 6class AddWorkModel extends ChangeNotifier { 7 String? workerName; 8 String? workName; 9 bool? complite; 10 int? manHour; 11 int? phase; 12 Timestamp? startTime; 13 14 Future addWork() async { 15 FirebaseFirestore.instance.collection("nowWork").add({ 16 "complite": false, 17 "manHour": "", 18 "phase": 1, 19 "workerName": "", 20 "workName": workName, 21 "startTime": Timestamp.now(), 22 }); 23 } 24}
page
1import 'package:cloud_firestore/cloud_firestore.dart'; 2import 'package:flutter/material.dart'; 3import 'package:flutter/src/foundation/key.dart'; 4import 'package:flutter/src/widgets/framework.dart'; 5import 'package:main/model/add_work_model.dart'; 6import 'package:main/model/work_list.dart'; 7import 'package:provider/provider.dart'; 8 9import '../../model/work_list_model.dart'; 10 11class InstructionPage extends StatefulWidget { 12 const InstructionPage({Key? key}) : super(key: key); 13 14 @override 15 State<InstructionPage> createState() => _InstructionPageState(); 16} 17 18class _InstructionPageState extends State<InstructionPage> { 19 String _currentname = ""; 20 @override 21 Widget build(BuildContext context) { 22 return ChangeNotifierProvider<WorkListModel>( 23 create: (_) => WorkListModel()..fetchWorkList(), 24 child: Scaffold( 25 appBar: AppBar( 26 title: Text("指示選択"), 27 ), 28 body: Column( 29 mainAxisAlignment: MainAxisAlignment.center, 30 children: [ 31 Card( 32 margin: const EdgeInsets.all(30), 33 elevation: 8, 34 shadowColor: Colors.black, 35 shape: RoundedRectangleBorder( 36 37 borderRadius: BorderRadius.circular(10), 38 ), 39 child: Column( 40 children: const [ 41 ListTile( 42 leading: CircleAvatar( 43 backgroundImage: NetworkImage(""), 44 ), 45 title: Text("name"), 46 subtitle: Text("subtilte"), 47 ), 48 ], 49 ), 50 ), 51 ChangeNotifierProvider<WorkListModel>( 52 create: (_) => WorkListModel()..fetchWorkList(), 53 child: SizedBox( 54 height: 300, 55 child: Center(child: 56 Consumer<WorkListModel>(builder: (context, model, child) { 57 final works = model.works; 58 59 if (works == null) { 60 return const CircularProgressIndicator(); 61 } 62 63 final List<Widget> widgets = works 64 .map((workname) => RadioListTile<dynamic>( 65 groupValue: _currentname, 66 title: Text(workname.name), 67 value: workname.name, 68 onChanged: (value) { 69 setState(() { 70 debugPrint('workname = $value'); 71 _currentname = value!; 72 }); 73 }, 74 )) 75 .toList(); 76 return ListView(children: widgets); 77 })), 78 ), 79 ), 80 ChangeNotifierProvider<AddWorkModel>( 81 create: (_) => AddWorkModel(), 82 child: Container(child: Consumer<AddWorkModel>( 83 builder: ((context, model, child) { 84 return ElevatedButton( 85 child: const Text("決定"), 86 onPressed: () async { 87 try { 88 await model.addWork(); 89 ScaffoldMessenger.of(context) 90 .showSnackBar(SnackBar( 91 behavior: SnackBarBehavior.floating, 92 content: Text("指示が飛ばされました!"), 93 action: SnackBarAction( 94 label: "OK", 95 onPressed: () async { 96 print('SnackBarActionをクリックしました'); 97 Navigator.of(context).pop(); 98 }, 99 ))); 100 await FirebaseFirestore.instance 101 .collection("nowWork") 102 .add({ 103 "workName": "$_currentname", 104 "complite": false, 105 "manHour": int.parse(""), 106 "phase": 1, 107 }); 108 if (_currentname == "掃除") { 109 await FirebaseFirestore.instance 110 .collection("clean_history") 111 .add({ 112 "workName": "$_currentname", 113 "complite": false, 114 "manHour": int.parse(""), 115 "phase": 1, 116 }); 117 } else if (_currentname == "休憩") { 118 await FirebaseFirestore.instance 119 .collection("clean_history") 120 .add({ 121 "workName": "$_currentname", 122 "complite": false, 123 "manHour": int.parse(""), 124 "phase": 1, 125 }); 126 } else if (_currentname == "プログラム") { 127 await FirebaseFirestore.instance 128 .collection("clean_history") 129 .add({ 130 "workName": "$_currentname", 131 "complite": false, 132 "manHour": int.parse(""), 133 "phase": 1, 134 }); 135 } else if (_currentname == "ピッキング") {} 136 } catch (e) { 137 print("$e==保存エラーです。"); 138 CircularProgressIndicator(); 139 } 140 }); 141 }), 142 ))) 143 ], 144 ), 145 )); 146 } 147} 148 149
試したこと
実際にfirebaseに登録されるものの
_currentname がnullとなっています。
初期化時の値に文字列を入れても入っていません。
補足情報(FW/ツールのバージョンなど)
Fluter 3.0.5
vscode
回答1件
あなたの回答
tips
プレビュー