- 팔로우 버튼 누르면 +, - 하기
- if문으로 팔로우 여부 확인
| import 'package:flutter/cupertino.dart'; |
| import 'package:flutter/material.dart'; |
| import './style.dart' as style; |
| 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'; |
| import 'package:shared_preferences/shared_preferences.dart'; |
| import 'dart:convert'; |
| import 'package:provider/provider.dart'; |
| |
| void main() { |
| runApp( |
| ChangeNotifierProvider( |
| create: (c) => Store1(), |
| child: MaterialApp( |
| theme: style.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 list = [1, 2, 3]; |
| var map = {'name':'john', 'age':20}; |
| var data = []; |
| var userImage; |
| var userContent; |
| |
| saveData() async { |
| var storage = await SharedPreferences.getInstance(); |
| |
| var map = {'age' : 20}; |
| storage.setString('map', jsonEncode(map)); |
| var result = storage.getString('map') ?? '업는데요'; |
| print(jsonDecode(result)['age']); |
| } |
| |
| 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; |
| }); |
| } |
| |
| 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; |
| }); |
| |
| } |
| |
| @override |
| void initState() { |
| super.initState(); |
| saveData(); |
| 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, addData : addData), Text('샵페이지')][tab], |
| bottomNavigationBar: BottomNavigationBar( |
| showSelectedLabels: false, |
| showUnselectedLabels: false, |
| onTap: (i){ |
| setState(() { |
| tab = i; |
| }); |
| }, |
| items: [ |
| BottomNavigationBarItem(icon: Icon(Icons.home_outlined), label: '홈'), |
| BottomNavigationBarItem(icon: Icon(Icons.shopping_bag_outlined), label: '샵') |
| ], |
| ), |
| ); |
| } |
| } |
| |
| class Home extends StatefulWidget { |
| const Home({Key? key, this.data, this.addData}) : super(key: key); |
| final data, 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) { |
| |
| 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( |
| constraints: BoxConstraints(maxWidth: 600), |
| padding: EdgeInsets.all(20), |
| width: double.infinity, |
| child: Column( |
| children: [ |
| GestureDetector( |
| child: Text(widget.data[i]['user']), |
| onTap: () { |
| Navigator.push(context, |
| PageRouteBuilder(pageBuilder: (c, a1, a2) => Profile(), |
| transitionsBuilder: (c, a1, a2, child) => |
| FadeTransition(opacity: a1, child: child) |
| ) |
| ); |
| }, |
| ), |
| Text('좋아요 ${widget.data[i]['likes'].toString()}'), |
| Text(widget.data[i]['date']), |
| 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, setUserContent, addMyData; |
| |
| @override |
| |
| Widget build(BuildContext context) { |
| return Scaffold( |
| appBar: AppBar(actions: [ |
| IconButton(onPressed: () { |
| addMyData(); |
| }, icon: Icon(Icons.send)) |
| ],), |
| body: Column( |
| crossAxisAlignment: CrossAxisAlignment.start, |
| children: [ |
| IconButton( |
| onPressed: (){ |
| Navigator.pop(context); |
| }, |
| icon: Icon(Icons.close) |
| ), |
| Image.file(userImage), |
| Text('이미지업로드화면'), |
| TextField(onChanged: (text) { |
| setUserContent(text); |
| },), |
| ], |
| ) |
| ); |
| } |
| } |
| |
| class Store1 extends ChangeNotifier { |
| var name = 'john kim'; |
| var follower = 0; |
| var friend = false; |
| |
| changeName() { |
| name = 'john park'; |
| notifyListeners(); |
| } |
| |
| addFollower() { |
| if(friend == false) { |
| friend = true; |
| follower++; |
| } else { |
| friend = false; |
| follower--; |
| } |
| notifyListeners(); |
| } |
| } |
| |
| class Profile extends StatelessWidget { |
| const Profile({Key? key}) : super(key: key); |
| |
| @override |
| Widget build(BuildContext context) { |
| return Scaffold( |
| appBar: AppBar(title: Text(context.watch<Store1>().name),), |
| body: Row( |
| mainAxisAlignment: MainAxisAlignment.spaceAround, |
| children: [ |
| CircleAvatar(radius: 30, backgroundColor: Colors.grey,), |
| Text('팔로우 ${context.watch<Store1>().follower}명'), |
| ElevatedButton(onPressed: () { |
| context.read<Store1>().addFollower(); |
| }, child: Text('팔로우')) |
| ] |
| ) |
| ); |
| } |
| } |