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

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

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

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

Flutter

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

Dart

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

Q&A

解決済

1回答

642閲覧

fetchJoinedRooms()内の変数userIdsが値として返ってこない問題

ituking

総合スコア80

Firebase

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

Flutter

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

Dart

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

0グッド

0クリップ

投稿2023/03/12 13:26

編集2023/03/13 04:47
  • fetchJoinedRooms()内の変数userIdsが値として返ってこない問題を解決させて後続の処理を実行させる。

前提

Flutter × Firebaseを用いてチャットアプリを開発しています。
自分が参加しているトークルームの情報を取得する処理を実装中に以下の問題が発生しました。

発生している問題・エラーメッセージ

変数userIdsの値が返ってこない。

該当のソースコード

room_firestore.dart

1import 'dart:math'; 2 3import 'package:chat_app/firestore/user_firestore.dart'; 4import 'package:chat_app/model/talk_room.dart'; 5import 'package:chat_app/model/user.dart'; 6import 'package:chat_app/utils/shared_prefs.dart'; 7import 'package:cloud_firestore/cloud_firestore.dart'; 8import 'package:flutter/foundation.dart'; 9 10class RoomFireStore { 11 static final FirebaseFirestore _firebaseFirestoreInstance = 12 FirebaseFirestore.instance; 13 static final _roomCollection = _firebaseFirestoreInstance.collection('room'); 14 15 static Future<void> createRoom(String myUid) async { 16 try { 17 final docs = await UserFirestore.fetchUsers(); 18 if (docs == null) return; 19 for (var element in docs) { 20 if (element.id == myUid) return; 21 await _roomCollection.add({ 22 'joined_user_id': [element.id, myUid], 23 'created_time': Timestamp.now(), 24 }); 25 } 26 } catch (e) { 27 if (kDebugMode) { 28 print("FAILED ===== $e"); 29 } 30 } 31 } 32 33 static Future<void> fetchJoinedRooms() async { 34 try { 35 String myUid = SharedPrefs.fetchUid()!; 36 if (kDebugMode) { 37 print(myUid); 38 } 39 final snapshot = await _roomCollection 40 .where('joined_user_id', arrayContains: myUid) 41 .get(); 42 List<TalkRoom> talkRooms = []; 43 for (var doc in snapshot.docs) { 44 List<dynamic> userIds = doc.data()['joined_user_id']; 45 if (kDebugMode) { 46 print(userIds); 47 } 48 late String talkUserUid; 49 for (var id in userIds) { 50 if (id == myUid) return; 51 talkUserUid = id; 52 } 53 User? talkUser = await UserFirestore.fetchProfile(talkUserUid); 54 if (talkUser == null) return; 55 final talkRoom = TalkRoom( 56 roomId: doc.id, 57 talkUser: talkUser, 58 lastMessage: doc.data()['last_message'], 59 ); 60 talkRooms.add(talkRoom); 61 } 62 if (kDebugMode) { 63 print(talkRooms.length); 64 } 65 } catch ($e) { 66 if (kDebugMode) { 67 print("FAILED ===== $e"); 68 } 69 } 70 } 71} 72 73

main.dart

1import 'package:chat_app/firestore/room_firestore.dart'; 2import 'package:chat_app/firestore/user_firestore.dart'; 3import 'package:chat_app/pages/top_page.dart'; 4import 'package:chat_app/utils/shared_prefs.dart'; 5import 'package:firebase_core/firebase_core.dart'; 6import 'package:flutter/material.dart'; 7 8import 'firebase_options.dart'; 9 10void main() async { 11 WidgetsFlutterBinding.ensureInitialized(); 12 await Firebase.initializeApp( 13 options: DefaultFirebaseOptions.currentPlatform, 14 ); 15 await SharedPrefs.setPrefsInstance(); 16 String? uid = SharedPrefs.fetchUid(); 17 if (uid == null) await UserFirestore.createUser(); 18 await RoomFireStore.fetchJoinedRooms(); 19 runApp(const MyApp()); 20} 21 22class MyApp extends StatelessWidget { 23 const MyApp({super.key}); 24 25 @override 26 Widget build(BuildContext context) { 27 return MaterialApp( 28 debugShowCheckedModeBanner: false, 29 title: 'Flutter Demo', 30 theme: ThemeData( 31 primarySwatch: Colors.green, 32 ), 33 home: const TopPage(), 34 ); 35 } 36} 37

試したこと

自分が参加しているトークルームの情報を取得する処理fetchJoinedRooms()を一通り実装した後にテストで実行してみたところ、変数userIdsが値として返ってこないことが判明。

以下、やったこと

1、Firestoreデータベースのルールを変更して、すべてのユーザーがデータを読み取るように変更
2、fetchJoinedRooms()内の変数myUidは値が返って来ていることを確認済み。
3、続いて変数userIdsが取得できるか確認したところ、取得できないことが判明。
4、joined_user_idフィールドのタイプミスがあったため、修正したが未だ改善せず。

whereメソッドについて参考にした記事

https://zenn.dev/flutteruniv_dev/articles/9bd0ba530d9ee9

arrayContainsについて参考にした記事

https://zenn.dev/mamushi/articles/a5e6c9f71e6ea4

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

[✓] Flutter (Channel stable, 3.3.10, on macOS 13.0.1
22A400 darwin-x64, locale ja-JP)
[✓] Android toolchain - develop for Android devices
(Android SDK version 32.1.0-rc1)
[✓] Xcode - develop for iOS and macOS (Xcode 14.2)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.2)
[✓] VS Code (version 1.74.3)
[✓] Connected device (3 available)
[✓] HTTP Host Availability

追記

3/12 ファイル更新
3/13 追記

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

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

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

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

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

guest

回答1

0

自己解決

コレクションのIDが違っていたことによる問題。
プログラムとしての処理は間違っていなかったのでプログラマーがCloud Firestoreに登録するときのIDの違いに気づいていなかったことによるミスなので、IDを一致させたところ処理として値が返ってきたので本件クローズ。

投稿2023/03/14 01:35

ituking

総合スコア80

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問