2 글 보임 - 1 에서 2 까지 (총 2 중에서)
-
글쓴이글
-
2022년 8월 12일 12:11 #42016
해피쇼참가자a라는 내용이 setUserContent에 계속 남아 저번 a를 반영하여 아무 내용이 없이 사진을 게시해도 똑같은 내용만 나오는데 이를 해결할 방법이 있을까요??? setUserContent(a)함수를 수정하거나 @override Widget build 부분의 setUserContent(text) 부분을 if 함수로 변경하면 null<->string 비호환 경고 구문이 나와 이틀째 고생이네요. 하단은 지금까지 코딩한 내용입니다. 항상 양질의 강의 감사합니다.
import 'package:flutter/material.dart'; import 'package:instagram/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(), )); }
class MyApp extends StatefulWidget { const MyApp({Key? key}) : super(key: key); @override State<MyApp> createState() => _MyAppState(); }
class _MyAppState extends State<MyApp> { var tab = 0; var data = []; var userImage; var userContent;
addMyData(){ var myData = { 'id': data.length, 'image': userImage, 'likes': 5, 'date': 'July 25', 'content': userContent, 'liked': false, 'user': 'John Kim' }; setState((){ data.insert(0, myData); }); }
setUserContent(a){ setState((){ userContent = a; }); }
@override void initState() { super.initState(); getData();
}
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); data = result2; }
@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.camera); if(image != null){ setState((){ userImage = File(image.path);
}); }
Navigator.push(context, MaterialPageRoute(builder: (c) => Upload( userImage : userImage, setUserContent : setUserContent, addMyData : addMyData,) )); }, ) ], ),
body: [bodyUI(data: data, addData : addData), Text('shop')]
,bottomNavigationBar: BottomNavigationBar( showSelectedLabels: false, showUnselectedLabels: false, onTap: (i){ setState((){ tab = i; }); }, items: [ BottomNavigationBarItem(icon: Icon(Icons.home_outlined), label: 'home'), BottomNavigationBarItem(icon: Icon(Icons.shopping_bag_outlined), label: 'shop') ]), ); } }
class bodyUI extends StatefulWidget { const bodyUI({Key? key, this.data, this.addData}) : super(key: key); final data; final addData;
@override State<bodyUI> createState() => _bodyUIState(); }
class _bodyUIState extends State<bodyUI> {
var scroll = ScrollController();
getMoreData() 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){ getMoreData(); } }); }
@override Widget build(BuildContext context) {
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']), Container( padding: EdgeInsets.all(20), width: double.infinity, constraints: BoxConstraints(maxWidth: 600), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('좋아요 ${widget.data[i]['likes']}'), Text(widget.data[i]['user']), Text(widget.data[i]['content']) ], ), ) ], ); }); } //if문 끝 else { return Text('loading'); } }
}
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( resizeToAvoidBottomInset: false, appBar: AppBar( actions: [ IconButton(onPressed: (){ addMyData(); }, icon: Icon(Icons.send)) ], leading: IconButton(onPressed: (){ Navigator.pop(context);}, icon: Icon(Icons.close)), ), body: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Image.file(userImage, height: MediaQuery.of(context).size.height - 500 , alignment: Alignment.centerRight,), TextField(decoration: InputDecoration(labelText: '내용적기', prefixText: 'XOX'), onChanged: (text){ setUserContent(text); }, ), ], ), ); }
}
-
글쓴이글
2 글 보임 - 1 에서 2 까지 (총 2 중에서)
- 답변은 로그인 후 가능합니다.