• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Flutter 게시판 스크롤 위치 파악관련 질문

스크롤 위치 파악관련 질문

10 글 보임 - 1 에서 10 까지 (총 11 중에서)
  • 글쓴이
  • #43892

    김다연
    참가자
    안녕하세요!
    코딩애플님 코드대로 쳤는데 제대로 반영이 안되어서요!ㅠ
    아래까지 스크롤해도 새로운 게시물 하나가 뜨지 않습니다.
    어떤 게 틀렸는지 질문할 수 있을까용?
    
    
    import 'package:flutter/material.dart';
    import './style.dart';
    import 'package:http/http.dart' as http;
    import 'dart:convert';
    import 'package:flutter/rendering.dart'; //스크롤 관련 유용한 함수들
    void main() {
      runApp(MaterialApp(theme: theme, home: MyApp()));
    }
    //var도 사용 안 함
    class MyApp extends StatefulWidget {
      const MyApp({Key? key}) : super(key: key);
      @override
      State<MyApp> createState() => _MyAppState();
    }
    class _MyAppState extends State<MyApp> {
      var tab = 0; //state에 tab의 현재상태 저장 '홈' 이렇게 한글로 저장해도 상관x
      var data = [];
      addData(a) {
        setState(() {
          data.add(a);
        });
      }
      getData() async {
        var result = await http
            .get(Uri.parse('https://codingapple1.github.io/app/data.json'));
        var result2 = jsonDecode(result.body);
        setState(() {
          data = result2;
        });
      }
      void initState() {
        super.initState();
        getData();
      }
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(
              'Instagram',
            ),
            actions: [
              IconButton(
                icon: Icon(Icons.add_box_outlined),
                onPressed: () {},
                iconSize: 30,
              )
            ],
          ),
          body: [
            Home(
              data: data,
            ),
            Text('샵페이지')
          ]

    , bottomNavigationBar: BottomNavigationBar( showUnselectedLabels: false, //이렇게 해주면 밑에 안뜸 showSelectedLabels: false, currentIndex: tab, onTap: (i) { setState(() { tab = i; }); }, items: [ BottomNavigationBarItem( label: '홈', icon: Icon(Icons.home_outlined), activeIcon: Icon(Icons.home)), BottomNavigationBarItem( label: '샵', icon: Icon(Icons.shopping_bag_outlined), activeIcon: Icon(Icons.shopping_bag)) ], ), ); } }
    class Home extends StatefulWidget {
      const Home({Key? key, this.data, this.addData}) : super(key: key);
      final data;
      final addData;
      @override
      State<Home> createState() => _HomeState();
    }
    class _HomeState extends State<Home> {
      var scroll = ScrollController();
      getMore() async {
        var result = await http
            .get(Uri.parse('https://codingapple1.github.io/app/more1.json'));
        var result2 = jsonDecode(result.body);
        widget.addData(result2);
      }
      @override
      void initState() {
        super.initState();
        scroll.addListener(() {
          if (scroll.position.pixels == scroll.position.maxScrollExtent) {
            getMore();
          }
        });
      }
      @override
      Widget build(BuildContext context) {
        print(widget.data);
        if (widget.data.isNotEmpty) {
          return ListView.builder(
              itemCount: widget.data.length, //리스트의 길이만큼
              controller: scroll,
              itemBuilder: (c, i) {
                return Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Image.network(widget.data[i]['image']),
                    Text('좋아요 ${widget.data[i]['likes']}'),
                    Text(widget.data[i]['user']),
                    Text(widget.data[i]['content']),
                  ],
                );
              });
        } else {
          return Text('로딩중임');
        }
      }
    }
    
    #43922

    codingapple
    키 마스터
    scroll.addListener(() {
    안에 있는 if문 실행이 안되는건지도 확인하고 스크롤 높이도 출력해봅시다
    #43954

    김다연
    참가자
      print(scroll.position.pixel) 했는데 실행창에 위치가 안뜨고 이렇게 뜹니다 
    뭘 더 수정해야 할까요
    
    Reloaded 1 of 660 libraries in 899ms.
    E/flutter ( 4915): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: NoSuchMethodError: The method 'call' was called on null.
    E/flutter ( 4915): Receiver: null
    E/flutter ( 4915): Tried calling: call(_LinkedHashMap len:7)
    E/flutter ( 4915): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:38:5)
    E/flutter ( 4915): #1      _HomeState.getMore (package:instagram/main.dart:109:19)
    E/flutter ( 4915): <asynchronous suspension>
    E/flutter ( 4915): 
    
    #44001

    codingapple
    키 마스터
       body: [
            Home(
              data: data,
            ),
            Text('샵페이지')
          ]
    [] 뒤에 [0] 이런게 없는것같은데요
    #44019

    김다연
    참가자
    답변 감사합니다! 그런데 여전히 오류가 뜨네요ㅜ
    
    E/flutter (24291): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: NoSuchMethodError: The method 'call' was called on null.
    E/flutter (24291): Receiver: null
    E/flutter (24291): Tried calling: call(_LinkedHashMap len:7)
    E/flutter (24291): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:38:5)
    E/flutter (24291): #1      _HomeState.getMore (package:instagram/main.dart:151:19)
    E/flutter (24291): <asynchronous suspension>
    E/flutter (24291): 
    
    코드는 고쳤습니다.
    새 게시물 추가까지 반영한 코드여서 좀 길지만 스크롤 관련 부분만 봐주시면 정말 감사하겠습니다!ㅠㅠ
    
    
    import 'package:flutter/material.dart';
    import './style.dart';
    import 'package:http/http.dart' as http;
    import 'dart:convert';
    import 'package:flutter/rendering.dart'; //스크롤 관련 유용한 함수들
    import 'package:image_picker/image_picker.dart';
    import 'dart:io';
    void main() {
      runApp(MaterialApp(theme: theme, home: MyApp()));
    }
    //var도 사용 안 함
    class MyApp extends StatefulWidget {
      const MyApp({Key? key}) : super(key: key);
      @override
      State<MyApp> createState() => _MyAppState();
    }
    class _MyAppState extends State<MyApp> {
      var tab = 0; //state에 tab의 현재상태 저장 '홈' 이렇게 한글로 저장해도 상관x
      var data = [];
      //선택한 이미지를 위젯에 보여주기
      var userImage;
      var userContent;
      addMyData() {
        var myData = {
          'id': data.length, //유니크한 번호 부여가능
          'image': userImage,
          'likes': 5,
          'date': 'July 25',
          'content': userContent,
          'liked': false,
          'user': 'Dayeon',
        };
        setState(() {
          data.insert(0, myData);
        });
      }
      setUserContent(a) {
        setState(() {
          userContent = a;
        });
      }
      addData(a) {
        setState(() {
          data.add(a);
        });
      }
      getData() async {
        var result = await http
            .get(Uri.parse('https://codingapple1.github.io/app/data.json'));
        var result2 = jsonDecode(result.body);
        setState(() {
          data = result2;
        });
      }
      void initState() {
        super.initState();
        getData();
      }
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(
              'Instagram',
            ),
            actions: [
              IconButton(
                icon: Icon(Icons.add_box_outlined),
                onPressed: () async {
                  var picker = ImagePicker();
                  var image = await picker.pickImage(source: ImageSource.gallery);
                  if (image != null) {
                    setState(() {
                      userImage = File(image.path); //이미지 경로를 저장
                    });
                  }
                  //새로운 페이지 띄우고싶으면
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (c) => Upload(
                                userImage: userImage,
                                setUserContent: setUserContent,
                                addMyData: addMyData,
                              )));
                },
                iconSize: 30,
              )
            ],
          ),
          body: [
            Home(
              data: data,
            ),
            Text('샵페이지')
          ]

    , bottomNavigationBar: BottomNavigationBar( showUnselectedLabels: false, //이렇게 해주면 밑에 안뜸 showSelectedLabels: false, currentIndex: tab, onTap: (i) { setState(() { tab = i; }); }, items: [ BottomNavigationBarItem( label: '홈', icon: Icon(Icons.home_outlined), activeIcon: Icon(Icons.home)), BottomNavigationBarItem( label: '샵', icon: Icon(Icons.shopping_bag_outlined), activeIcon: Icon(Icons.shopping_bag)) ], ), ); } }
    class Home extends StatefulWidget {
      const Home({Key? key, this.data, this.addData}) : super(key: key);
      final data;
      final addData;
      @override
      State<Home> createState() => _HomeState();
    }
    class _HomeState extends State<Home> {
      var scroll = ScrollController();
      getMore() async {
        var result = await http
            .get(Uri.parse('https://codingapple1.github.io/app/more1.json'));
        var result2 = jsonDecode(result.body);
        widget.addData(result2);
      }
      @override
      void initState() {
        super.initState();
        scroll.addListener(() {
          if (scroll.position.pixels == scroll.position.maxScrollExtent) {
            getMore();
          }
        });
      }
      @override
      Widget build(BuildContext context) {
        print(widget.data);
        if (widget.data.isNotEmpty) {
          return ListView.builder(
              itemCount: widget.data.length, //리스트의 길이만큼
              controller: scroll,
              itemBuilder: (c, i) {
                return Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    widget.data[i]['image'].runtimeType == String
                        ? Image.network(widget.data[i]['image'])
                        : Image.file(widget.data[i]['image']),
                    Text('좋아요 ${widget.data[i]['likes']}'),
                    Text(widget.data[i]['user']),
                    Text(widget.data[i]['content']),
                  ],
                );
              });
        } else {
          return Text('로딩중임');
        }
      }
    }
    class Upload extends StatelessWidget {
      const Upload({Key? key, this.userImage, this.setUserContent, this.addMyData})
          : super(key: key);
      final userImage;
      final setUserContent;
      final addMyData;
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            actions: [
              IconButton(
                  onPressed: () {
                    addMyData();
                  },
                  icon: Icon(Icons.send))
            ],
          ),
          body: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Center(
                child: Container(
                    width: 300,
                    height: 300,
                    child: Image.file(
                      userImage,
                      fit: BoxFit.fill,
                    )),
              ), //파일 경로로 이미지 띄우기
              Text('이미지업로드화면'),
              TextField(
                onChanged: (text) {
                  setUserContent(text);
                },
              ),
              IconButton(
                  onPressed: () {
                    Navigator.pop(context);
                  },
                  icon: Icon(Icons.close))
            ],
          ),
        );
      }
    }
    
    
    
    
    #44127

    codingapple
    키 마스터
      void initState() {
        super.initState();
    위에 @override가 없나봅니다
    #44159

    김다연
    참가자
    @override
    void initState() {
      super.initState();
    
    말씀해주신대로 이렇게 바꿔줬는데용
    E/flutter (27944): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: NoSuchMethodError: The method 'call' was called on null.
    E/flutter (27944): Receiver: null
    E/flutter (27944): Tried calling: call(_LinkedHashMap len:7)
    E/flutter (27944): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:38:5)
    E/flutter (27944): #1      _HomeState.getMore (package:instagram/main.dart:173:19)
    E/flutter (27944): <asynchronous suspension>
    E/flutter (27944): 
    
    여전히 이런 오류가 뜨네요
    
    
    #44174

    codingapple
    키 마스터
    Home() 위젯 쓸 때 addData도 보내줍시다
    #44191

    김다연
    참가자
    Home위젯 안에
    
    MaterialPageRoute(
        builder: (c) => Upload(
              userImage: userImage,
              setUserContent: setUserContent,
              addMyData: addMyData,
              addData: addData,
            )))
    이렇게
    addData도 추가해주고 싶은데요
    
    addData에 빨간밑줄이 그어지더니
    
    The name parameter addData isn't defined라고 뜨네요
    위에 잘 선언되어있는데 이유를 모르겠어요
    #44222

    김다연
    참가자
    아 이제 게시글 잘 뜨는데
    크롬웹으로 실행해보면 게시글이 무한대로 생깁니다
    이렇게 뜨는 게 맞을까요
10 글 보임 - 1 에서 10 까지 (총 11 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠