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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Flutter

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

Dart

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

Q&A

解決済

1回答

757閲覧

【Flutter】RadioListTileで選択した項目をfirebaseに登録する方法

my0930

総合スコア19

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Flutter

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

Dart

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

0グッド

0クリップ

投稿2022/08/26 04:33

編集2022/08/30 20:17

前提

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

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

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

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

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

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

moriman

2022/08/29 07:38

ソースコードを拝見させて頂いきました。 _currentnameはString型、つまりnull非許容型なので、_currentnameの値がnullになることはないと思うのですが、 _currentnameがnullになる、とはどういう意味ですか? それと、 初期化時の値に文字列を入れても入っていません。 というのもよくわからないのですが、どういう現象を指していますか? 何かエラーメッセージが出ていますか?
my0930

2022/08/29 23:59 編集

ご返信ありがとうございます。 firebaseに登録された値が complite:false manHour:"" phase:1 startTime:2022年8月29日 9:49:57 UTC+9 workName:null workerName:"" となっている状況です。 初期化時の文字列は String _currentname=""; と現在は入力していますが String  _currentname="プログラミング"と入力しておいても firebaseに入る値はnullのままでした。 エラー文は特に出ていません。
moriman

2022/08/30 03:20

コードで特に違和感を感じる部分も無いんですよね。 workNameフィールドの書き込みがうまくいっていないようなのですが、Firebase側のworkNameフィールドの型はString型になっていますか? それくらいしか頭に浮かばないです。
my0930

2022/08/30 03:34

やはりつなぎ目がうまくいってない気がします… worknameは、null型でnullになってます。
moriman

2022/08/30 03:40

null型じゃなくてString型に指定したらどうでしょう?
my0930

2022/08/30 03:48

申し訳ないです。 Elevatedbutton押した後にcatchの I/flutter (32059): FormatException: Invalid number (at character 1) I/flutter (32059): I/flutter (32059): ^ I/flutter (32059): ==保存エラーです。 が出てました。
moriman

2022/08/30 03:55

やはり型が合っていないような気がしますね。 workNameフィールドの型をString型にしてみましたか? (at character 1) とあるので、"phase"フィールドですかね? とりあえず全てのフィールドの型を確認してみてはどうでしょうか。
my0930

2022/08/30 04:19 編集

解決しました。 addworkの引数にcurrentNameを入れて workNameに代入したら追加されました。 考えがまとまってわかることができました。ありがとうございます。
moriman

2022/08/30 11:17

良かったです! 頑張ってください!
guest

回答1

0

自己解決

addworkの引数にcurrentNameを入れて
workNameに代入したら追加されました。

投稿2022/08/30 04:20

my0930

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問