rr - rlatkddbs99/Flutter GitHub Wiki

image image image image
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import '../model/profile.dart';

class AuthController extends GetxController{
  var idcontroller = TextEditingController(); //id๋ฐ›๊ธฐ
  var pwController = TextEditingController(); //pw๋ฐ›๊ธฐ
  final Rxn<User> user = Rxn<User>(); //Auth์—์„œ ๋งŒ๋“ค์–ด์ฃผ๋Š” User
  final Rxn<Profile> profile = Rxn<Profile>();  //์ •๋ณด๋ณ€๊ฒฝ ์œ„ํ•จ
  fetchProfile(String uId) async{   //๊ฐœ๊ฐœ์ธ์˜ uId๋กœ ์ •๋ณด ๋ณ€๊ฒฝ
   var res = await FirebaseFirestore.instance.collection('profile').doc(uId).get();
   print(res.data());
   var data = res.data()!;
   
   
   profile(Profile(culture: data['culture'], job: data['job'], age: data['age']));  //์›ํ•˜๋Š” ์ •๋ณด๋กœ ๋ณ€๊ฒฝ
  }
  
  @override //์œ ์ €์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์ง€ ์บ์นญ
  onInit(){
    super.onInit();
    //์œ ์ €์ƒํƒœ ๋ฐ”๋€Œ๋ฉด ๋ญํ• ๊ฑด์ง€
    FirebaseAuth.instance.userChanges().listen((value) { 
     //์œ ์ € ๊ฐ’ ๊ฐฑ์‹ 
     user(value);
      if(value != null){  
        fetchProfile(value.uid);
        Get.toNamed("/main");
      }else { //์œ ์ €๊ฐ€ ์—†๋Š” ์ƒํƒœ, login์œผ๋กœ ๊ฐ€
        Get.toNamed("/login"); 
      }
    });
  }
  
   handleLoginButton() async{
     var res = await FirebaseAuth.instance.signInWithEmailAndPassword( //์ด๋ฉ”์ผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธ
        email: idcontroller.text, password: pwController.text);
  }

  
}
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:project1/model/movie_message.dart';


import '../../controller/movie_controller.dart';
import '../widget/logo.dart';
import 'movieReply_page.dart';


class MoViePage extends GetView<MovieController> {
  const MoViePage({super.key});
  static const String route = '/movie';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(centerTitle: true,
        backgroundColor: Colors.transparent,
        elevation: 0,
        title: Text("movie"),
        leading: InkWell(child: Icon(Icons.arrow_back),onTap:(){
          Navigator.pop(context);
        }),
        actions: [
          InkWell(child: Icon(Icons.edit),onTap: () {
            Get.toNamed("/edit");
          },)
        ],
      ),
     
      backgroundColor: Color(0XffA5A9FF),
      body: SingleChildScrollView(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Logo(),
            SizedBox(height: 50,),
            
            Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
              
                Container(
                    width: 300,
                    height: 100,
                    decoration: BoxDecoration(
                      image: DecorationImage(
                        fit: BoxFit.fill,
                        image: AssetImage("assets/images/movie.jpeg"))
                    ),
                  ),
                StreamBuilder<List<MovieMessage>>(
                  stream: streamMessages(),
                  builder: (context, asyncSnapshot) {
                    if(!asyncSnapshot.hasData){
                      return const Center(child: CircularProgressIndicator(),);
                    }else if(asyncSnapshot.hasError){
                      return const Center(child: CircularProgressIndicator(),);
                    }else {
                      List<MovieMessage> messages = asyncSnapshot.data!;
                  return SizedBox(
                    height: 400,
                    child: Column(
                      mainAxisSize: MainAxisSize.max,
                      children: [
                        Expanded(
                            child: ListView.builder(
                                itemCount: messages.length,
                                itemBuilder: (context, index) {
                                  return ListTile(
                                    onTap: () {
                                      Get.to(MovieReplyPage());
                                    },
                                    title: Text(messages[index].content),
                                     subtitle: Text(messages[index].sendDate.toDate().toLocal().toString().substring(5,16)),
                                    trailing: Icon(Icons.arrow_right),
                                  );
                                })),
                                //controller.editWidget()
                              ],
                              
                        ),
                  );
                    }
                  },
                ),
                controller.editWidget(),
              ],
            )
          ],
        ),
      ),
    );
  }

  Stream<List<MovieMessage>> streamMessages(){
    try{
      final Stream<QuerySnapshot> snapshots = FirebaseFirestore.instance.collection(
'chatrooms/XeXVNgcrPflF18on7Dg8/messages').orderBy('sendDate').snapshots();
      return snapshots.map((querySnapshot){
        List<MovieMessage> messages = [];
        querySnapshot.docs.forEach((element) { 
           messages.add(
              MovieMessage.fromMap(
                  id:element.id,
                  map:element.data() as Map<String, dynamic>
              )
           );
        });
        return messages; 
      }); 

    }catch(ex){//์˜ค๋ฅ˜ ๋ฐœ์ƒ ์ฒ˜๋ฆฌ
      print("์˜ค๋ฅ˜");
    }
    return Stream.error(Error);
  }
}
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:project1/controller/movie_controller.dart';
import 'package:project1/model/movie_reply.dart';

import '../widget/logo.dart';

class MovieReplyPage extends StatefulWidget {
  const MovieReplyPage({super.key});

  @override
  State<MovieReplyPage> createState() => _MovieReplyPageState();
}

class _MovieReplyPageState extends State<MovieReplyPage> {
  TextEditingController controller = TextEditingController();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false,
        appBar: AppBar(centerTitle: true,
        backgroundColor: Colors.transparent,
        elevation: 0,
        title: Text("movie"),
        leading: InkWell(child: Icon(Icons.arrow_back),onTap:(){
          Navigator.pop(context);
        }),
        actions: [
          InkWell(child: Icon(Icons.edit),onTap: () {
            Get.toNamed("/edit");
          },)
        ],
      ),
      backgroundColor: Color(0XffA5A9FF),
      body: SingleChildScrollView(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Logo(),
            SizedBox(height: 50,),
            Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                StreamBuilder<List<MovieReply>>(
                  stream: streamMessages(),
                  builder: (context, asyncSnapshot) {
                    if(!asyncSnapshot.hasData){
                      return const Center(child: CircularProgressIndicator(),);
                    }else if(asyncSnapshot.hasError){
                      return const Center(child: CircularProgressIndicator(),);
                    }else {
                      List<MovieReply> messages = asyncSnapshot.data!;
                  return Container(
                    height: 500,
                    child: Column(
                      mainAxisSize: MainAxisSize.max,
                      children: [
                        Expanded(
                            child: ListView.builder(
                                itemCount: messages.length,
                                itemBuilder: (context, index) {
                                  return ListTile(
                                    title: Text(messages[index].content),
                                     subtitle: Text(messages[index].sendDate.toDate().toLocal().toString().substring(5,16)),
                                  );
                                })),
                                
                              ],
                        ),
                  );
                    }
                  },
                ),
                getInputWidget()
              ],
            )
          ],
        ),
      )
    );
  }
    Widget getInputWidget() {
    return Container(
      height: 60,
      width: double.infinity,
      decoration: BoxDecoration(boxShadow: const [
        BoxShadow(color: Colors.black12, offset: Offset(0, -2), blurRadius: 3)
      ], ),
      child: Padding(
        padding: EdgeInsets.symmetric(horizontal: 15,vertical: 8),
        child: Row(
          mainAxisSize: MainAxisSize.max,
          children: [
            Expanded(
              child: TextField(
                controller: controller,
                decoration: InputDecoration(
                  labelStyle: TextStyle(fontSize: 15),
                  labelText: "๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”..",
                  fillColor: Colors.white,
                  focusedBorder: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(25.0),
                    borderSide: BorderSide(
                      color: Colors.blue,
                    ),
                  ),
                  enabledBorder: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(25.0),
                    borderSide: BorderSide(
                      color: Colors.black26,
                      width: 1.0,
                    ),
                  ),
                ),
              ),
            ),
            SizedBox(width: 10,),
            RawMaterialButton(
              onPressed: _onPressedSendButton, //์ „์†ก๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ๋•Œ ๋™์ž‘์‹œํ‚ฌ ๋ฉ”์†Œ๋“œ
              constraints: BoxConstraints(
                minWidth: 0,
                minHeight: 0
              ),
              elevation: 2,
             
              shape: CircleBorder(),
              child: Padding(
                padding: EdgeInsets.all(10),
                child: Icon(Icons.send),
              ),
            )
          ],
        ),
      ),
    );
  }

   void _onPressedSendButton(){
    try{
      
      MovieReply messageModel = MovieReply(content: controller.text,sendDate: Timestamp.now());
      FirebaseFirestore firestore = FirebaseFirestore.instance;
      firestore.collection('chatrooms2/OvQK5w14xBvTVnPBasfA/messages').add(messageModel.toMap());

    }catch(ex){
      print("ํ•˜");
    }
  }

   Stream<List<MovieReply>> streamMessages(){
    try{
     
      final Stream<QuerySnapshot> snapshots = FirebaseFirestore.instance.collection('chatrooms2/OvQK5w14xBvTVnPBasfA/messages').orderBy('sendDate').snapshots();
      return snapshots.map((querySnapshot){
        List<MovieReply> messages = [];
        querySnapshot.docs.forEach((element) { 
           messages.add(
              MovieReply.fromMap(
                  id:element.id,
                  map:element.data() as Map<String, dynamic>
              )
           );
        });
        return messages; 
      }); 

    }catch(ex){//์˜ค๋ฅ˜ ๋ฐœ์ƒ ์ฒ˜๋ฆฌ
      print("์˜ค๋ฅ˜");
    }
    return Stream.error(Error);
  }
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ