답변 감사합니다! 그런데 여전히 오류가 뜨네요ㅜ
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))
],
),
);
}
}