Flutter  학습/채팅 앱 만들기

채팅앱 만들기2 (앱과 Firebase 연결)

Everyday Growing Engineer 2023. 2. 21. 15:32

Firebase의 Cloud Firestore와 앱과 연결하기

 

1. android/app/build.gradle 파일 수정

... 생략 ...
    
defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.example.chat_app"
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
        minSdkVersion flutter.minSdkVersion
        targetSdkVersion flutter.targetSdkVersion
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        multiDexEnable true //이부분 추가됨
    }
    
... 생략 ...

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation "com.android.support:multidex:1.0.3" //이부분 추가됨
}

... 생략 ...

 

2. main.dart 생성

import 'package:flutter/material.dart';
import 'screens/chat_screen.dart';
import 'package:firebase_core/firebase_core.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final Future<FirebaseApp> _firebaseApp = Firebase.initializeApp();

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false, // hide "debug" banner
      title: 'FlutterChat',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FutureBuilder(
        future: _firebaseApp,
        builder: (context, snapshot) {
          if (snapshot.hasError) {
            debugPrint('snapshot error - ${snapshot.error}');
            return const Text('Snapshot error');
          } else if (snapshot.hasData) {
            return const ChatScreen();
          } else {
            return const Center(child: CircularProgressIndicator());
          }
        },
      ),
    );
  }
}
  • Firebase를 사용하려면 먼저 Firebase.initializeApp() 부분 생성.

 

3. chat_screen.dart 파일 생성

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';

class ChatScreen extends StatelessWidget {
  const ChatScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
        stream: FirebaseFirestore.instance
            .collection('chats/5faluq62QDSCE83nxKok/message')
            .snapshots(),
        builder: (ctx, streamSnapshot) {
          if (streamSnapshot.connectionState == ConnectionState.waiting) {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          final documents = streamSnapshot.data!.docs;
          return ListView.builder(
            itemCount: streamSnapshot.data!.docs.length,
            itemBuilder: (ctx, index) => Container(
              padding: const EdgeInsets.all(8),
              child: Text(documents[index]['text']),
            ),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          FirebaseFirestore.instance
              .collection('chats/5faluq62QDSCE83nxKok/message')
              .add({'text': 'This was added by clicking the button!'});
        },
      ),
    );
  }
}

 

StreamBuilder : 비동기로 데이터 가져올때 사용합니다. FutureBuilde와는 다르게 리스너를 통하여 데이터 변경을 계속 관찰하고 수시로 데이터를 가져옵니다. 

 

데이터를 가져오는 부분

FirebaseFirestore.instance
            .collection('chats/5faluq62QDSCE83nxKok/message')
            .snapshots()

데이터를 추가하는 부분

FirebaseFirestore.instance
              .collection('chats/5faluq62QDSCE83nxKok/message')
              .add({'text': 'This was added by clicking the button!'});

 

결과 화면: