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

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

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

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

Flutter

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Dart

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

Q&A

解決済

1回答

600閲覧

ChangeNotifierProviderを使ったModelの状態管理ができない

utasan_1008

総合スコア56

Firebase

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

Flutter

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Dart

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

0グッド

0クリップ

投稿2022/02/24 07:25

実現したいこと

以下のようにFireStoreに登録をしたいです。

-attendaces   -uid   -uid   -name   -createdAt   -attendance

以下Modelファイルです

Dart

1import 'package:cloud_firestore/cloud_firestore.dart'; 2import 'package:firebase_auth/firebase_auth.dart'; 3import 'package:flutter/material.dart'; 4 5class QRModel extends ChangeNotifier { 6 // final uidController = TextEditingController(); 7 // final nameController = TextEditingController(); 8 // final attendanceController = TextEditingController(); 9 10 String? uid; 11 String? name; 12 String? attendance; 13 14 bool isLoading = false; 15 16 void startLoading() { 17 isLoading = true; 18 notifyListeners(); 19 } 20 21 void endLoading() { 22 isLoading = false; 23 notifyListeners(); 24 } 25 26 void setUid(String uid) { 27 this.uid = uid; 28 notifyListeners(); 29 } 30 31 void setName(String name) { 32 this.name = name; 33 notifyListeners(); 34 } 35 36 void setAttendance(String attendance) { 37 this.attendance = attendance; 38 notifyListeners(); 39 } 40 41 Future signUp() async { 42 // this.uid = uidController.text; 43 //this.name = nameController.text; 44 //this.attendance = attendanceController.text; 45 46 var user = FirebaseAuth.instance.currentUser; 47 48 if (user != null) { 49 print(uid); 50 // firestoreに追加 51 final doc = FirebaseFirestore.instance.collection('attendaces').doc(uid); 52 await doc.set({'createdAt': Timestamp.now()}, SetOptions(merge: true)); 53 await doc.set({ 54 'uid': uid, 55 'name': name, 56 // 'timeStamp': timeStamp, 57 'attendance': attendance, 58 }); 59 } 60 } 61} 62

変更を伝えるファイル

このファイルでChangeNotifierProviderでmodelに変数の値を渡したいのですが
TextFieldのように動的にTextを変えるのではなく、currentUserの定数?を
どこかでセットしたいです。
TextFieldを一応試しましたが上手くいかなかったので遷移なしで値を渡せる方法はありますでしょうか?

Dart

1import 'package:attendanc_management_app/scan_qr_code/qr_model.dart'; 2import 'package:cloud_firestore/cloud_firestore.dart'; 3import 'package:firebase_auth/firebase_auth.dart'; 4import 'package:flutter/material.dart'; 5import 'package:provider/provider.dart'; 6import '../mypage/my_model.dart'; 7 8class AttendaveRegister extends StatelessWidget { 9 10 String? uid; 11 String? email; 12 String? name; 13 String? attendance; 14 final currentUser = FirebaseAuth.instance.currentUser; 15 16 17 Widget build(BuildContext context) { 18 this.uid = currentUser!.uid; 19 this.email = currentUser!.email; 20 this.name = currentUser!.displayName; 21 this.timeStamp = DateTime.now().millisecondsSinceEpoch; 22 var dateNow = 23 DateFormat('MM/dd kk:mm').format(Timestamp.now().toDate()).toString(); 24 this.attendance = "出席"; 25 26 return ChangeNotifierProvider<QRModel>( 27 create: (_) => QRModel(), 28 child: Scaffold( 29 appBar: AppBar( 30 title: Text("出席登録"), 31 ), 32 body: Center( 33 child: Container( 34 height: deviceHeight * 0.5, 35 width: double.infinity, 36 child: Consumer<QRModel>(builder: (context, model, child) { 37 return Stack(children: [ 38 Padding( 39 padding: const EdgeInsets.only(top: 50.0), 40 child: Column( 41 children: [ 42 Row( 43 mainAxisAlignment: MainAxisAlignment.center, 44 children: [ 45 Container( 46 height: deviceHeight * 0.25, 47 width: deviceWidth * 0.75, 48 child: Column(children: [ 49 // FireStore保存用InvisibletextField 50 Visibility( 51 visible: false, 52 child: TextField( 53 enabled: false, 54 controller: model.uidController, 55 onChanged: (text) { 56 model.setUid(uid!); 57 }, 58 ), 59 ), 60 Visibility( 61 visible: false, 62 child: TextField( 63 enabled: false, 64 controller: model.nameController, 65 onChanged: (text) { 66 model.setName(name!); 67 }, 68 ), 69 ), 70 71 Visibility( 72 visible: false, 73 child: TextField( 74 enabled: false, 75 controller: model.attendanceController, 76 onChanged: (text) { 77 model.setAttendance(attendance!); 78 }, 79 ), 80 ), 81 ]), 82 ), 83 ], 84 ), 85 Text("上記内容で出席しますか?"), 86 ElevatedButton( 87 onPressed: () async { 88 model.startLoading(); 89 90 // 追加の処理 91 try { 92 await model.signUp(); 93 Navigator.of(context).pop(); 94 } catch (e) { 95 final snackBar = SnackBar( 96 backgroundColor: Colors.red, 97 content: Text(e.toString()), 98 ); 99 ScaffoldMessenger.of(context) 100 .showSnackBar(snackBar); 101 } finally { 102 model.endLoading(); 103 } 104 }, 105 child: Text('出席する'), 106 ), 107 ], 108 ), 109 ), 110 ]); 111 }), 112 ), 113 ), 114 ), 115 ); 116 // throw UnimplementedError(); 117 } 118} 119

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

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

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

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

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

guest

回答1

0

自己解決

Dart

1import 'package:cloud_firestore/cloud_firestore.dart'; 2import 'package:firebase_auth/firebase_auth.dart'; 3import 'package:flutter/material.dart'; 4 5class QRModel extends ChangeNotifier { 6 String? uid; 7 String? name; 8 String? attendance; 9 10 11 bool isLoading = false; 12 13 void startLoading() { 14 isLoading = true; 15 notifyListeners(); 16 } 17 18 void endLoading() { 19 isLoading = false; 20 notifyListeners(); 21 } 22 23 void setUid(String uid) { 24 this.uid = uid; 25 notifyListeners(); 26 } 27 28 void setName(String name) { 29 this.name = name; 30 notifyListeners(); 31 } 32 33 void setAttendance(String attendance) { 34 this.attendance = attendance; 35 notifyListeners(); 36 } 37 38 Future signUp() async { 39 var user = FirebaseAuth.instance.currentUser; 40 41 if (user != null) { 42 final doc = FirebaseFirestore.instance.collection('attendances').doc(uid); 43 await doc.set({ 44 'uid': uid, 45 'createdAt': Timestamp.now(), 46 'name': name, 47 'attendance': attendance, 48 }); 49 } 50 } 51} 52

Dart

1onPressed: () async { 2 model.startLoading(); 3 model.setName(name!); 4 model.setUid(uid!); 5 model.setAttendance(attendance!); 6 7 // 追加の処理 8 try { 9 await model.signUp(); 10 Navigator.of(context).pop(); 11 } catch (e) { 12 final snackBar = SnackBar( 13 backgroundColor: Colors.red, 14 content: Text(e.toString()), 15 ); 16 ScaffoldMessenger.of(context) 17 .showSnackBar(snackBar); 18 } finally { 19 model.endLoading(); 20 } 21 },

投稿2022/02/24 15:24

utasan_1008

総合スコア56

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問