요약 - 리스트 아이템을 선택하면 동물페이지가 뜨고 좋아요를 누를 수 있게 됨
주요 기능
main.dart
- 메인 페이지이며 리스트 제너레이터 사용법 확인
- navigator를 통해 animal_page로 넘어갈 때 animalData를 넘겨줌
import 'package:flutter/material.dart';
import 'package:mild_2_listview/animal_page.dart';
import 'package:mild_2_listview/model.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: MyPage(),
);
}
}
class MyPage extends StatefulWidget {
const MyPage({Key? key}) : super(key: key);
@override
State<MyPage> createState() => _MyPageState();
}
class _MyPageState extends State<MyPage> {
static List<String> animalName = [
'Bear',
'Camel',
'Deer',
'Fox',
'Kangaroo',
'Koala',
'Lion',
'Tiger'
];
static List<String> animalImagePath = [
'image/bear.png',
'image/camel.png',
'image/deer.png',
'image/fox.png',
'image/kangaroo.png',
'image/koala.png',
'image/lion.png',
'image/tiger.png'
];
static List<String> animalLocation = [
'forest and mountain',
'dessert',
'forest',
'snow mountain',
'Australia',
'Australia',
'Africa',
'Korea'
];
final List<Animal> animalData = List.generate(
animalLocation.length,
(index) => Animal(
animalName[index], animalImagePath[index], animalLocation[index]));
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("ListView"),
),
body: ListView.builder(
itemCount: animalData.length,
itemBuilder: (context, index) {
//debugPrint(index.toString()+" : "+animalData[index].imgPath.toString());
return Card(
child: ListTile(
title: Text(animalData[index].name),
leading: SizedBox(
height: 50,
width: 50,
child: Image.asset(animalData[index].imgPath),
),
onTap: (){
Navigator.of(context).push(MaterialPageRoute(
builder: (context)=>AnimalPage(animal: animalData[index],)));
debugPrint(animalData[index].name);
},
));
}));
}
}
animal_page.dart
- 넘겨받음 animal데이터로 page구현
- like_button패키기 사용(https://pub.dev/packages/like_button/install)
import 'package:flutter/material.dart';
import 'package:mild_2_listview/model.dart';
import 'package:like_button/like_button.dart';
class AnimalPage extends StatefulWidget {
const AnimalPage({Key? key, required this.animal}) : super(key: key);
//null 값을 가질 수 없는 this.animal에는 required를 붙여준다
final Animal animal;
@override
State<AnimalPage> createState() => _AnimalPageState();
}
class _AnimalPageState extends State<AnimalPage> {
bool isLiked = false;
int likeCount = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.animal.name),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(
height: 200, width: 200, child: Image.asset(widget.animal.imgPath)),
const SizedBox(
height: 20,
),
Text('It lives in ' + widget.animal.location,
style: const TextStyle(
fontSize: 18
),),
const SizedBox(
height: 20,
),
LikeButton(
size: 30,
isLiked: isLiked,
likeCount: likeCount,
)
],
),
),
);
}
}
model.dart
- Animal클래스
import 'package:flutter/material.dart';
class Animal{
final String name; //final 은 runtime시에 값이 정해질 수 있기 때문에
final String imgPath;
final String location;
Animal(this.name, this.imgPath, this.location);
}
'플로터(Flutter) > 기본' 카테고리의 다른 글
(코딩쉐프) 조금 매운 맛 1강 (상속) (0) | 2023.01.13 |
---|---|
(코딩쉐프) 순한 맛 시즌 2 - 반응형으로 만드는 유튜브(모바일,데스크톱) (0) | 2023.01.12 |
안드로이드 스튜디오, Dart 편집 단축키 (0) | 2023.01.12 |
(코딩쉐프) 순한 맛 시즌 2 - 리스트뷰빌더 (0) | 2023.01.12 |
(코딩쉐프) 순한 맛 시즌 2 - 온보딩 스크린 (0) | 2023.01.05 |