Flutter로 고양이 투표 프로그램 만들기
항목 설정
인코딩을 시작하기 전에 프로젝트에 의존 항목을 추가할 것입니다.우선 상태 관리를 위해 바이브레이션 훅과 리버포드 훅이 필요합니다.그리고 나머지 호출에 대해서는 HTTP 패키지가 필요합니다.마지막으로 투명한 이미지 패키지를 추가합니다. 이미지를 불러올 때, 이 패키지를 사용해서 불러오는 순환을 보여 줍니다.
dependencies:
flutter:
sdk: flutter
http: ^0.13.3
flutter_hooks: ^0.17.0
hooks_riverpod: ^0.14.0
transparent_image: ^2.0.0
종속성 설치를 잊지 말고 다음 명령을 실행하십시오.flutter pub get
드래그 앤 드롭
용기의 드래그부터 시작합시다.그런 다음 Cat API에 연결할 수 있습니다.다행히도 떨림 속에서 드래그 앤 드롭을 만드는 것은 매우 간단합니다.우리 토론drag and drop in more detail here.하지만 이제 우리가 알아야 할 것은 드래그할 수 있는 작은 부품이 필요하다는 것이다.Draggable 위젯은 우리가 드래그할 수 있는 위젯입니다. 프로그램에 필요합니다.
class CatPage extends HookWidget {
@override
Widget build(BuildContext context) {
return new LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Center(
child: Draggable(
child: Container(
width: constraints.maxWidth - 10,
height: constraints.maxHeight - 200,
child: Card(
color: Colors.green,
child: Icon(Icons.downloading),
),
),
feedback: Center(
child: Container(
width: constraints.maxWidth - 10,
height: constraints.maxHeight - 200,
child: Card(
color: Colors.grey,
child: Icon(Icons.downloading),
),
),
),
),
);
});
}
}
우리는 이제 프로그램을 실행할 수 있다. 드래그할 수 있는 용기를 볼 수 있을 것이다.우리는 Draggable의 하위 요소를 제공했는데, 이것은 우리가 아무 일도 일어나지 않았을 때 본 것이다.피드백 파라미터도 있습니다.마지막으로, 우리가 되돌아오는 작은 위젯은 용기 주위를 드래그할 때 표시됩니다.이렇게 하면 런타임에 다음 애플리케이션이 나타납니다.드래그하기 전에 하위 값이 표시됩니다.피드백은 드래그된 작은 위젯입니다.
이제 우리는 드래그할 수 있는 작은 부품이 하나 생겼다.그러나 우리가 용기를 왼쪽이나 오른쪽에 두면 아무 일도 일어나지 않는다.이를 위해 OndragEnd 메소드를 다시 작성할 수 있습니다.이 방법은 Dragable Details를 제공합니다. Dragable Details는 사용자가 작은 위젯을 어디에 두는지 정보를 포함합니다.우리는 이 정보를 사용하여 사용자가 작은 위젯을 왼쪽에 두었는지 오른쪽에 두었는지 확인할 수 있다.
child: Draggable(
onDragEnd: (details) {
if (details.offset.dx > 20) {
print("Is dropped to the right");
} else if (details.offset.dx < -20) {
print("Is dropped to the left");
}
}
이 값 20은 응용 프로그램의 민감도를 결정하는 변수입니다.너는 이 값을 자세히 고려해서 어떤 민감도가 너의 응용에 가장 적합한지 보아야 한다.현재, 우리는 사용자가 왼쪽으로 이동하는지 오른쪽으로 이동하는지만 인쇄합니다.우리는 아직 API에 대한 호출이 없기 때문에, 우리는 잠시 후에 실제 실현으로 로그 기록을 교체할 것입니다.이미지 배치
이제 우리는 작은 부품을 드래그해서 작은 부품이 왼쪽으로 미끄러지는지 오른쪽으로 미끄러지는지 검사할 수 있다.즉, API를 호출하는 것부터 시작할 준비가 되어 있습니다.API를 사용하려는 경우 등록for a free API key here할 수 있습니다.이미지에 대한 정보를 반환하는 검색 API를 응용 프로그램에 호출합니다.API 검색 시 다음 정보가 반환됩니다.
[
{
"breeds": [],
"id": "19n",
"url": "https://cdn2.thecatapi.com/images/19n.gif",
"width": 499,
"height": 367
}
]
현재, 우리는 URL만 필요하지만, 그림에 대한 투표를 위해 id가 필요합니다.호출 주체를 대상에 반서열화하기 위해 대상을 만듭니다.class Cat {
final String id;
final String url;
Cat({
this.id,
this.url,
});
factory Cat.fromJson(Map json) {
return Cat(
id: json['id'],
url: json['url'],
);
}
}
현재 우리는 대상이 하나 있기 때문에 API를 호출하라고 한다.우리는 HTTP 패키지를 사용하여 단점에 대한 GET 호출을 실행할 수 있습니다. 우리는 앞에 이 점을 추가했습니다.우리는 비동기적인 방법이 있기 때문에 함수의 결과 값은 미래가 될 것이다.이것은 호출이 완료될 때까지 이 방법을 호출할 수 있음을 의미합니다.class CatRepository {
Future fetchCat() async {
final response = await http.get(
Uri.parse('https://api.thecatapi.com/v1/images/search'),
headers: {"x-api-key": "api-key", "Content-Type": "application/json"},
);
if (response.statusCode == 200) {
return Cat.fromJson(jsonDecode(response.body)[0]);
} else {
throw Exception('Failed to load Cat');
}
}
}
우리는 고양이 한 마리를 제공할 미래 공급업체를 만들 것이다.FutureProvider는 Riverpod 패키지에서 제공됩니다.우리discuss the Riverpod FututerProvider in more detail in this blog post.final cat = FutureProvider.autoDispose((ref) async {
return ref.watch(catRepository).fetchCat();
});
우리는 use Provider 방법으로 고양이의 그림에 대한 정보를 검색할 수 있습니다.갈고리를 사용하기 위해 HookWidget이 확장되었는지 확인하는 것을 잊지 마십시오.공급자가 우리에게 미래를 제공했기 때문에 우리는 이 미래의 when 방법을 실현할 수 있다.여기서 우리는 모든 장면을 위해 다른 작은 위젯을 되돌려줄 수 있다.데이터 장면은 API가cat을 반환할 때 사용됩니다.불러오는 것은 결과를 기다리고 있을 때와 호출이 실패했을 때의 오류입니다.class CatPage extends HookWidget {
@override
Widget build(BuildContext context) {
final currentCat = useProvider(cat);
return currentCat.when(
data: (catData) {
return new LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Center(
child: Draggable(
onDragEnd: (details) {
if (details.offset.dx > 20) {
print("Is dropped to the right");
} else if (details.offset.dx < -20) {
print("Is dropped to the left");
}
},
child: Container(
width: constraints.maxWidth - 10,
height: constraints.maxHeight - 200,
child: Card(
child: Stack(children: [
Loading(),
Center(child: CatImage(url: catData.url))
]),
),
),
feedback: Center(
child: Container(
width: constraints.maxWidth - 10,
height: constraints.maxHeight - 200,
child: Stack(children: [
Loading(),
Center(child: CatImage(url: catData.url))
]),
),
),
),
);
});
},
loading: () => Loading(),
error: (e, s) => ErrorWidget(s));
}
}
여기서 CatImage는 URL 컨텐트를 표시하는 간단한 위젯입니다.class CatImage extends StatelessWidget {
const CatImage({Key key, this.url,}) : super(key: key);
final String url;
@override
Widget build(BuildContext context) {
return FadeInImage.memoryNetwork(
placeholder: kTransparentImage,
image: url,
);
}
}
애플리케이션을 실행하면 고양이 한 마리가 표시됩니다.우리 프로그램의 첫 번째 고양이는 엄지손가락을 세울 거예요, 아니면 엄지손가락을 세울 거예요?
이미지를 평가하다
이제 우리는 API를 통해 고양이 사진 한 장을 전시했으니 투표할 때가 되었다!이를 위해 API에 다음 본문을 게시할 수 있습니다.
{
"image_id": "2gl",
"value": 1
}
이를 위해, 우리는 대상을 만들어서 이 주체를 서열화합니다.class Vote {
final String id;
final int value;
Vote(this.id, this.value);
Map toJson() => {
'image_id': id,
'value': value,
};
}
그런 다음 JSONE 코드를 사용하여 투표 결과를 API에 게시할 수 있습니다. rateCat(Vote vote) {
http.post(Uri.parse("https://api.thecatapi.com/v1/votes"),
headers: {
"x-api-key": "api-key",
"Content-Type": "application/json"
},
body: jsonEncode(vote));
}
다음 그림 보이기
마지막으로 우리는 현재의 고양이 그림에 대해 등급을 매긴 후에 다음 그림을 받아야 한다.이렇게 하는 동시에 우리는 약간의 개선을 실시할 것이다.현재 이미지를 등급을 매길 때 다음 그림을 추출합니다.그런 다음 드래그할 때 현재 이미지 아래에 다음 이미지가 표시됩니다.이를 위해 우리는 리버포드 가문의 전화를 충분히 이용할 수 있다.기존 값으로 돌아갈지 새 값으로 돌아갈지 결정하는 ID를 제공할 수 있습니다.우리는 매번 고양이 한 마리를 얻을 때마다 그것으로 새로운 고양이 그림을 검색할 수 있다.이것 또한 우리가 다음 고양이를 위해 전화를 할 수 있다는 것을 의미하며, 우리는 현재의 고양이를 검색하고 있다.
final cat = FutureProvider.autoDispose.family((ref, id) async {
return ref.watch(catRepository).fetchCat();
});
현재useProvider 방법에 추가 숫자를 제공할 수 있습니다.매번 번호가 같지 않을 때마다 다른 고양이를 검색할 수 있다.이 점을 결합하면, 우리는use State 갈고리를 사용하여 계수를 유지할 수 있으며, 이 수가 증가할 때마다, 우리는 API에서 다른cat을 검색할 수 있다.이제 고양이를 등급을 매긴 후에 우리는 계수를 늘려 다른 고양이를 얻을 수 있다. @override
Widget build(BuildContext context) {
final counter = useState(0);
final currentCat = useProvider(cat(counter.value));
return currentCat.when(
data: (catData) {
return new LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Center(
child: Draggable(
onDragEnd: (details) {
if (details.offset.dx > 20) {
rateCat(Vote(catData.id, 1));
counter.value++;
} else if (details.offset.dx < -20) {
rateCat(Vote(catData.id, 0));
counter.value++;
}
},
우리는 이미 precacheImage 방법을 호출해서 다음 고양이의 그림을 캐시할 수 있습니다. final nextCat = useProvider(cat(counter.value + 1));
nextCat.when(
data: (nextCat) {
precacheImage(Image.network(nextCat.url).image, context);
},
loading: () {},
error: (o, s) {},
);
현재cat 그림을 드래그하는 동시에 다음cat 그림을 표시하려면 일정한 상태를 유지해야 합니다.그림이 드래그되었는지 확인하려면useState를 사용하십시오.그리고 우리는 이 상태를 사용해서 확정할 수 있다.끌어당기는 전류는 다음 고양이의 전류일 것이다.class CatPage extends HookWidget {
rateCat(Vote vote) {
http.post(Uri.parse("https://api.thecatapi.com/v1/votes"),
headers: {"x-api-key": "api-key", "Content-Type": "application/json"},
body: jsonEncode(vote));
}
@override
Widget build(BuildContext context) {
final counter = useState(0);
final currentCat = useProvider(cat(counter.value));
final nextCat = useProvider(cat(counter.value + 1));
final dragging = useState(false);
nextCat.when(
data: (nextCat) {
precacheImage(Image.network(nextCat.url).image, context);
},
loading: () {},
error: (o, s) {},
);
return currentCat.when(
data: (catData) {
return new LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Center(
child: Draggable(
onDragEnd: (details) {
if (details.offset.dx > 20) {
rateCat(Vote(catData.id, 1));
counter.value++;
} else if (details.offset.dx < -20) {
rateCat(Vote(catData.id, 0));
counter.value++;
}
dragging.value = false;
},
onDragStarted: () {
dragging.value = true;
},
child: Container(
width: constraints.maxWidth - 10,
height: constraints.maxHeight - 200,
child: Card(
child: Stack(children: [
Loading(),
Center(
child: dragging.value == false
? CatImage(url: catData.url)
: nextCat.when(
data: (nextCat) {
return CatImage(url: nextCat.url);
},
loading: () {
return Loading();
},
error: (Object error, StackTrace stackTrace) {
return ErrorWidget(stackTrace);
},
),
)
]),
),
),
feedback: Center(
child: Container(
width: constraints.maxWidth - 10,
height: constraints.maxHeight - 200,
child: Card(
child: Stack(children: [
Loading(),
Center(child: CatImage(url: catData.url))
]),
),
),
),
),
);
});
},
loading: () => Loading(),
error: (e, s) => ErrorWidget(s));
}
}
본문을 읽어 주셔서 감사합니다.고양이를 사랑하는 사람으로서 나는 그 고양이들에게 점수를 매기기 위해 이 작은 프로그램을 만드는 데 오랜 시간이 걸렸다.이것은 매우 간단한 프로그램으로 떨림에 대한 정보를 더 많이 얻을 수 있다.상태 관리, 호출 API 및 처리 로드 상태가 들어 있습니다.너는 완전한 코드project on Github를 찾을 수 있다.최종 결과
게시물Creating a Cat Voting App with Flutter이 가장 먼저Barttje에 올라왔다.
Reference
이 문제에 관하여(Flutter로 고양이 투표 프로그램 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bartvwezel/creating-a-cat-voting-app-with-flutter-5a9f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)