jellyMain

제리·2022년 2월 19일
0
import 'package:cached_network_image/cached_network_image.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:provider/provider.dart';
import 'package:flutter/rendering.dart';

import '../main.dart';
import 'detail.dart';

class JellyMain extends StatefulWidget {
  const JellyMain({Key? key}) : super(key: key);

  
  State<JellyMain> createState() => _JellyMainState();
}

class _JellyMainState extends State<JellyMain> {
  var isAdded = false;
  var scroll = ScrollController();

  getMore() async {
    Provider.of<Store3>(context, listen: false).addLimitNum();
    Provider.of<Store3>(context, listen: false).getAdditionalData();
    scroll.position.jumpTo(MediaQuery.of(context).size.height);
  }

  
  void initState() {
    // TODO: implement initState
    super.initState();
    Future.microtask(() {
      Provider.of<Store3>(context, listen: false).getRegion();
      Provider.of<Store3>(context, listen: false).getFirstData();
      Provider.of<Store3>(context, listen: false).changeLimitNum();
    });
    scroll.addListener(() {
      if (scroll.position.pixels == scroll.position.maxScrollExtent) {
        getMore();
        print(Provider.of<Store3>(context, listen: false).limitNumber);
      }
    });
  }

  
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    scroll.dispose();
  }

  
  Widget build(BuildContext context) {
    final provider = Provider.of<Store3>(context);
    final providerLf = Provider.of<Store3>(context, listen: false);
    final deviceSize = MediaQuery.of(context).size;

    return FutureBuilder(
        future: provider.getFirstData(),
        builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
          if (snapshot.hasError) {
            return Text("오류가 발생했습니다.");
          }

          if (snapshot.hasData && (snapshot.data.docs.length==0)) {
            return Column(
              children: [
                Text("같은지역에 친구가 없네요"),
                if(isAdded) Container() else ElevatedButton(
                    style: ElevatedButton.styleFrom(primary: Color(0xffc09bf4)),
                    onPressed: () {
                      context.read<Store3>().getAdditionalData();
                      setState(() {
                        isAdded=true;
                      });
                    },
                    child: Text('다른지역 친구도보기')),
                if (isAdded)
                  Padding(
                    padding: EdgeInsets.only(top: deviceSize.width * 0.03),
                    child: Wrap(
                      spacing: deviceSize.width * 0.03,
                      runSpacing: deviceSize.width * 0.03,
                      children: [
                        for (var i = 0; i < provider.addQuery.docs.length; i++)
                          SizedBox(
                            width: deviceSize.width * 0.45,
                            child: ClipRRect(
                              borderRadius: BorderRadius.circular(17),
                              child: Hero(
                                tag: provider.addQuery.docs[i]['uid'],
                                child: Material(
                                  child: InkWell(
                                    onTap: (){
                                      Navigator.push(context, MaterialPageRoute(builder: (c)=>Detail(uid: provider.addQuery.docs[i]['uid'],url: provider.addQuery.docs[i]['프로필이미지'][5],)));
                                    },
                                    child: CachedNetworkImage(
                                      fit: BoxFit.cover,
                                      imageUrl: provider.addQuery.docs[i]['프로필이미지'][5],
                                    ),
                                  ),
                                ),
                              ),
                            ),
                          )
                      ],
                    ),
                  )
                else
                  Container()
              ],
            );
          }

          if ((snapshot.connectionState == ConnectionState.done)&&snapshot.hasData) {
            var data = snapshot.data;
            // return Text(data.docs.toString());
            return Column(
              children: [
                Expanded(
                  child: Padding(
                    padding: EdgeInsets.only(left: deviceSize.width * 0.03),
                    child: ListView.builder(
                      scrollDirection: Axis.vertical,
                      shrinkWrap: true,
                      itemCount: (data.docs.length/2).floor(),
                      controller: scroll,
                      itemBuilder: (c,i){
                        return Padding(
                          padding: EdgeInsets.only(bottom: deviceSize.width * 0.03,),
                          child: Wrap(
                            direction: Axis.horizontal,
                            spacing: deviceSize.width * 0.03,
                            runSpacing: deviceSize.width * 0.03,
                            children: [
                                Material(
                                  child: InkWell(
                                    onTap:(){
                                      Navigator.push(context, MaterialPageRoute(builder: (c)=>Detail(uid: data.docs[2*i]['uid'],url: data.docs[2*i]['프로필이미지'][5],)));
                                    },
                                    child: Stack(
                                      children: [
                                        Container(
                                          decoration: BoxDecoration(
                                            borderRadius: BorderRadius.circular(17),
                                            boxShadow: [
                                              BoxShadow(
                                                color: Colors.black26,
                                                blurRadius: 6,
                                                offset: Offset(0,3)
                                              )
                                            ]
                                          ),
                                          width: deviceSize.width * 0.45,
                                          child: ClipRRect(
                                            borderRadius: BorderRadius.circular(17),
                                            child: Hero(
                                              tag: data.docs[2*i]['uid'],
                                              child: CachedNetworkImage(
                                                fit: BoxFit.cover,
                                                imageUrl: data.docs[2*i]['프로필이미지'][5],
                                              ),
                                            ),
                                          ),
                                        ),
                                        SizedBox(
                                          width: deviceSize.width*0.45,
                                          height:deviceSize.width*0.45,
                                          child: Column(
                                            mainAxisAlignment: MainAxisAlignment.end,
                                            children: [
                                              Container(
                                                padding: EdgeInsets.only(left: 8),
                                                height:66,
                                                decoration: BoxDecoration(
                                                  borderRadius: BorderRadius.only(
                                                    bottomLeft: Radius.circular(12),
                                                    bottomRight: Radius.circular(12),
                                                  ),
                                                  gradient: LinearGradient(
                                                    begin: Alignment.topCenter,
                                                    end:Alignment.bottomCenter,
                                                    colors: [Colors.transparent,Colors.black26]
                                                  )
                                                ),
                                                child: Column(
                                                  children: [
                                                    Container(
                                                        width:deviceSize.width*0.45,
                                                        child: Wrap(
                                                          spacing: deviceSize.width*0.003,
                                                          children: [
                                                            for(var j=0;j<2;j++)
                                                              Container(
                                                                padding:EdgeInsets.only(left: 5,right: 5,bottom: 2),
                                                                decoration: BoxDecoration(
                                                                  borderRadius: BorderRadius.circular(11),
                                                                  color: Colors.black38
                                                                ),
                                                                child: Text(data.docs[2*i]['취미'][j],style: TextStyle(fontSize: 12,color: Colors.white,fontWeight: FontWeight.w500),)
                                                              ),
                                                          ],
                                                        )
                                                    ),
                                                    Container(
                                                      width:deviceSize.width*0.45,
                                                        child: Row(
                                                          children: [
                                                            Padding(
                                                              padding: const EdgeInsets.only(right: 6.0),
                                                              child: Text(data.docs[2*i]['닉네임'],style: TextStyle(fontSize: 15,color: Colors.white,fontWeight: FontWeight.w500),),
                                                            ),
                                                            Padding(
                                                              padding: const EdgeInsets.only(top: 1.0),
                                                              child: Text(data.docs[2*i]['나이'],style: TextStyle(fontSize: 15,color: Colors.white,fontWeight: FontWeight.w300)),
                                                            ),
                                                          ],
                                                        )
                                                    ),
                                                    Container(
                                                        width:deviceSize.width*0.45,
                                                        child: Row(
                                                          children: [
                                                            Padding(
                                                              padding: const EdgeInsets.only(right: 6.0),
                                                              child: Text('${data.docs[2*i]['지역']} ${data.docs[2*i]['상세']}',style: TextStyle(fontSize: 11.5,color: Colors.white,fontWeight: FontWeight.w300)),
                                                            ),
                                                            Text(data.docs[2*i]['직업'],style: TextStyle(fontSize: 11.5,color: Colors.white,fontWeight: FontWeight.w300)),
                                                          ],
                                                        )
                                                    ),
                                                  ],
                                                ),
                                              ),
                                            ],
                                          ),
                                        )
                                      ],
                                    ),
                                  ),
                                ),
                                Material(
                                  child: InkWell(
                                    onTap:(){
                                      Navigator.push(context, MaterialPageRoute(builder: (c)=>Detail(uid: data.docs[2*i+1]['uid'],url: data.docs[2*i+1]['프로필이미지'][5],)));
                                    },
                                    child: Stack(
                                      children: [
                                        Container(
                                          decoration: BoxDecoration(
                                              borderRadius: BorderRadius.circular(17),
                                              boxShadow: [
                                                BoxShadow(
                                                    color: Colors.black26,
                                                    blurRadius: 6,
                                                    offset: Offset(0,3)
                                                )
                                              ]
                                          ),
                                          width: deviceSize.width * 0.45,
                                          child: ClipRRect(
                                            borderRadius: BorderRadius.circular(17),
                                            child: Hero(
                                              tag: data.docs[2*i+1]['uid'],
                                              child: CachedNetworkImage(
                                                fit: BoxFit.cover,
                                                imageUrl: data.docs[2*i+1]['프로필이미지'][5],
                                              ),
                                            ),
                                          ),
                                        ),
                                        SizedBox(
                                          width: deviceSize.width*0.45,
                                          height:deviceSize.width*0.45,
                                          child: Column(
                                            mainAxisAlignment: MainAxisAlignment.end,
                                            children: [
                                              Container(
                                                padding: EdgeInsets.only(left: 8),
                                                height:66,
                                                decoration: BoxDecoration(
                                                    borderRadius: BorderRadius.only(
                                                      bottomLeft: Radius.circular(12),
                                                      bottomRight: Radius.circular(12),
                                                    ),
                                                    gradient: LinearGradient(
                                                        begin: Alignment.topCenter,
                                                        end:Alignment.bottomCenter,
                                                        colors: [Colors.transparent,Colors.black26]
                                                    )
                                                ),
                                                child: Column(
                                                  children: [
                                                    Container(
                                                        width:deviceSize.width*0.45,
                                                        child: Wrap(
                                                          spacing: deviceSize.width*0.003,
                                                          children: [
                                                            for(var j=0;(j<2)&&(j<data.docs[2*i+1]['취미'].length);j++)
                                                              Container(
                                                                  padding:EdgeInsets.only(left: 5,right: 5,bottom: 2),
                                                                  decoration: BoxDecoration(
                                                                      borderRadius: BorderRadius.circular(11),
                                                                      color: Colors.black38
                                                                  ),
                                                                  child: Text(data.docs[2*i+1]['취미'][j],style: TextStyle(fontSize: 12,color: Colors.white,fontWeight: FontWeight.w500),)
                                                              ),
                                                          ],
                                                        )
                                                    ),
                                                    Container(
                                                        width:deviceSize.width*0.45,
                                                        child: Row(
                                                          children: [
                                                            Padding(
                                                              padding: const EdgeInsets.only(right: 6.0),
                                                              child: Text(data.docs[2*i+1]['닉네임'],style: TextStyle(fontSize: 15,color: Colors.white,fontWeight: FontWeight.w500),),
                                                            ),
                                                            Padding(
                                                              padding: const EdgeInsets.only(top: 1.0),
                                                              child: Text(data.docs[2*i+1]['나이'],style: TextStyle(fontSize: 15,color: Colors.white,fontWeight: FontWeight.w300)),
                                                            ),
                                                          ],
                                                        )
                                                    ),
                                                    Container(
                                                        width:deviceSize.width*0.45,
                                                        child: Row(
                                                          children: [
                                                            Padding(
                                                              padding: const EdgeInsets.only(right: 6.0),
                                                              child: Text('${data.docs[2*i+1]['지역']} ${data.docs[2*i+1]['상세']}',style: TextStyle(fontSize: 11.5,color: Colors.white,fontWeight: FontWeight.w300)),
                                                            ),
                                                            Text(data.docs[2*i+1]['직업'],style: TextStyle(fontSize: 11.5,color: Colors.white,fontWeight: FontWeight.w300)),
                                                          ],
                                                        )
                                                    ),
                                                  ],
                                                ),
                                              ),
                                            ],
                                          ),
                                        )
                                      ],
                                    ),
                                  ),
                                ),
                            ],
                          ),
                        );
                      },
                    ),
                  ),
                ),
                if(isAdded) Container() else ElevatedButton(
                    style: ElevatedButton.styleFrom(primary: Color(0xffc09bf4)),
                    onPressed: () {
                      context.read<Store3>().getAdditionalData();
                      setState(() {
                        isAdded=true;
                      });
                    },
                    child: Text('다른지역 친구도보기')),
                if (isAdded)
                  Padding(
                    padding: EdgeInsets.only(top: deviceSize.width * 0.03),
                    child: Wrap(
                      spacing: deviceSize.width * 0.03,
                      runSpacing: deviceSize.width * 0.03,
                      children: [
                        for (var i = 0; i < provider.addQuery.docs.length; i++)
                          SizedBox(
                            width: deviceSize.width * 0.45,
                            child: ClipRRect(
                              borderRadius: BorderRadius.circular(17),
                              child: Hero(
                                tag: provider.addQuery.docs[i]['uid'],
                                child: Material(
                                  child: InkWell(
                                    onTap: (){
                                      Navigator.push(context, MaterialPageRoute(builder: (c)=>Detail(uid: provider.addQuery.docs[i]['uid'],url: provider.addQuery.docs[i]['프로필이미지'][5],)));
                                    },
                                    child: CachedNetworkImage(
                                      fit: BoxFit.cover,
                                      imageUrl: provider.addQuery.docs[i]['프로필이미지'][5],
                                    ),
                                  ),
                                ),
                              ),
                            ),
                          )
                      ],
                    ),
                  )
                else
                  Container()
              ],
            );
          }

          return SpinKitPulse(
            color: Color(0xffc09bf4),
            size: 50.0,
          );
        },
      );
  }
}
profile
iOS 준비중

0개의 댓글