[Flutter] 좋아하는 기능을 쉽게 구현하자!
14261 단어 Flutter
가장 쉽게 좋아하는 기능을 구현합니다!
두 가지 방법을 소개합니다. 원하는 방식으로 구현하십시오!
둘 다 간단하기 때문에 안심!
※주의
· StatefulWidget에서 setState()를 사용하면 쉽게 만들 수 있지만 전체가 재구성되기 때문에 이미지와 텍스트가 많은 화면에서 재구성되면 문제가 발생하거나 처리가 굳어지므로 StatefulWidget은 사용하지 않습니다.
・SNS의 기능으로서 좋아 기능을 실장하는 경우는, 이 기사만으로는 불충분합니다.
왜냐하면 좋아하는 것을 저장해야하기 때문에 서버 측과 결합해야하기 때문입니다.
1.flutter_hooks를 이용한 방법
2.provider를 이용한 방법
완제품
준비
패키지를 도입합니다.
pubspec.yaml hooks_riverpod: ^0.14.0+4
provider: ^5.0.0
준비 완료.
1.flutter_hooks를 이용한 방법
코드를 모두 넣으십시오!
hooks_page.dartimport 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
class HooksPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("flutter_hooksパターン"),
),
body: ListView.builder(
itemCount: 10,
itemBuilder: (context, index) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(
index.toString() + "番目",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20,
),
),
FavoriteButton()
],
);
}),
);
}
}
class FavoriteButton extends HookWidget {
@override
Widget build(BuildContext context) {
final favorite = useState<bool>(false);
return IconButton(
onPressed: () =>
(favorite.value) ? favorite.value = false : favorite.value = true,
icon: Icon(
Icons.favorite,
color: (favorite.value) ? Colors.pink : Colors.black12,
),
);
}
}
중요한 부분만 발췌합니다.
class FavoriteButton extends HookWidget {
@override
Widget build(BuildContext context) {
final favorite = useState<bool>(false);
return IconButton(
onPressed: () =>
(favorite.value) ? favorite.value = false : favorite.value = true,
icon: Icon(
Icons.favorite,
color: (favorite.value) ? Colors.pink : Colors.black12,
),
);
}
}
favorite의 값이 변경되면(자), 내부의 notifyListeners();가 실행되어 HookWidget가 리빌드 됩니다.
2.provider를 이용한 방법
provider_page.dartimport 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ProviderPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("providerパターン"),
),
body: ListView.builder(
itemCount: 10,
itemBuilder: (context, index) {
return ChangeNotifierProvider<FavoriteModel>(
create: (_) => FavoriteModel(),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(
index.toString() + "番目",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20,
),
),
Consumer<FavoriteModel>(builder: (context, model, child) {
return IconButton(
onPressed: model.changeColor,
icon: Icon(
Icons.favorite,
color: model.favorite ? Colors.pink : Colors.black12,
),
);
})
],
));
}),
);
}
}
class FavoriteModel extends ChangeNotifier {
bool favorite = false;
void changeColor() {
if (favorite) {
favorite = false;
} else {
favorite = true;
}
notifyListeners();
}
}
각 List에 대해 FavoriteModel()을 생성하므로 create: (_) => FavoriteModel()의 위치가 중요합니다. 버튼을 누르면 model.chageColor가 호출되므로 Consumer로 둘러싸인 부분이 다시 빌드됩니다.
Reference
이 문제에 관하여([Flutter] 좋아하는 기능을 쉽게 구현하자!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/flutter_bird/items/80de28f5a1c17f54b67b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
패키지를 도입합니다.
pubspec.yaml
hooks_riverpod: ^0.14.0+4
provider: ^5.0.0
준비 완료.
1.flutter_hooks를 이용한 방법
코드를 모두 넣으십시오!
hooks_page.dartimport 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
class HooksPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("flutter_hooksパターン"),
),
body: ListView.builder(
itemCount: 10,
itemBuilder: (context, index) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(
index.toString() + "番目",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20,
),
),
FavoriteButton()
],
);
}),
);
}
}
class FavoriteButton extends HookWidget {
@override
Widget build(BuildContext context) {
final favorite = useState<bool>(false);
return IconButton(
onPressed: () =>
(favorite.value) ? favorite.value = false : favorite.value = true,
icon: Icon(
Icons.favorite,
color: (favorite.value) ? Colors.pink : Colors.black12,
),
);
}
}
중요한 부분만 발췌합니다.
class FavoriteButton extends HookWidget {
@override
Widget build(BuildContext context) {
final favorite = useState<bool>(false);
return IconButton(
onPressed: () =>
(favorite.value) ? favorite.value = false : favorite.value = true,
icon: Icon(
Icons.favorite,
color: (favorite.value) ? Colors.pink : Colors.black12,
),
);
}
}
favorite의 값이 변경되면(자), 내부의 notifyListeners();가 실행되어 HookWidget가 리빌드 됩니다.
2.provider를 이용한 방법
provider_page.dartimport 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ProviderPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("providerパターン"),
),
body: ListView.builder(
itemCount: 10,
itemBuilder: (context, index) {
return ChangeNotifierProvider<FavoriteModel>(
create: (_) => FavoriteModel(),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(
index.toString() + "番目",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20,
),
),
Consumer<FavoriteModel>(builder: (context, model, child) {
return IconButton(
onPressed: model.changeColor,
icon: Icon(
Icons.favorite,
color: model.favorite ? Colors.pink : Colors.black12,
),
);
})
],
));
}),
);
}
}
class FavoriteModel extends ChangeNotifier {
bool favorite = false;
void changeColor() {
if (favorite) {
favorite = false;
} else {
favorite = true;
}
notifyListeners();
}
}
각 List에 대해 FavoriteModel()을 생성하므로 create: (_) => FavoriteModel()의 위치가 중요합니다. 버튼을 누르면 model.chageColor가 호출되므로 Consumer로 둘러싸인 부분이 다시 빌드됩니다.
Reference
이 문제에 관하여([Flutter] 좋아하는 기능을 쉽게 구현하자!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/flutter_bird/items/80de28f5a1c17f54b67b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
class HooksPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("flutter_hooksパターン"),
),
body: ListView.builder(
itemCount: 10,
itemBuilder: (context, index) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(
index.toString() + "番目",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20,
),
),
FavoriteButton()
],
);
}),
);
}
}
class FavoriteButton extends HookWidget {
@override
Widget build(BuildContext context) {
final favorite = useState<bool>(false);
return IconButton(
onPressed: () =>
(favorite.value) ? favorite.value = false : favorite.value = true,
icon: Icon(
Icons.favorite,
color: (favorite.value) ? Colors.pink : Colors.black12,
),
);
}
}
class FavoriteButton extends HookWidget {
@override
Widget build(BuildContext context) {
final favorite = useState<bool>(false);
return IconButton(
onPressed: () =>
(favorite.value) ? favorite.value = false : favorite.value = true,
icon: Icon(
Icons.favorite,
color: (favorite.value) ? Colors.pink : Colors.black12,
),
);
}
}
provider_page.dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ProviderPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("providerパターン"),
),
body: ListView.builder(
itemCount: 10,
itemBuilder: (context, index) {
return ChangeNotifierProvider<FavoriteModel>(
create: (_) => FavoriteModel(),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(
index.toString() + "番目",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20,
),
),
Consumer<FavoriteModel>(builder: (context, model, child) {
return IconButton(
onPressed: model.changeColor,
icon: Icon(
Icons.favorite,
color: model.favorite ? Colors.pink : Colors.black12,
),
);
})
],
));
}),
);
}
}
class FavoriteModel extends ChangeNotifier {
bool favorite = false;
void changeColor() {
if (favorite) {
favorite = false;
} else {
favorite = true;
}
notifyListeners();
}
}
각 List에 대해 FavoriteModel()을 생성하므로 create: (_) => FavoriteModel()의 위치가 중요합니다. 버튼을 누르면 model.chageColor가 호출되므로 Consumer로 둘러싸인 부분이 다시 빌드됩니다.
Reference
이 문제에 관하여([Flutter] 좋아하는 기능을 쉽게 구현하자!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/flutter_bird/items/80de28f5a1c17f54b67b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)