大家安安 晚上好~~
今天要把專案裡的StatelessWidget 更改成為 StatefulWidget
我想要加入點讚的功能去計算我的寵物的讚數
首先我們先加入按讚的按鈕
及顯示的的讚數
程式碼的部分則加入一段
IconButton(
onPressed: () => {
pet.likes++
},
icon: Icon(
Icons.thumb_up,
color: Colors.blue,
),
),
]),
SizedBox(
height: 16.0,
),
Text(
'Likes:${pet.likes}',
style: TextStyle(color: Colors.blue, fontSize: 26.0),
),
但是這樣的話點擊了讚的按鈕並不會+1
所以我們改成 StatefulWidget來讓點擊時能夠+1
class Petdialog extends StatefulWidget {
Petdialog({Key key, this.pet}) : super(key: key);
final Pet pet;
@override
State<StatefulWidget> createState() => _DialogState();
}
class _DialogState extends State<Petdialog> {
@override
Widget build(BuildContext context) {
ThemeData localTheme = Theme.of(context);
return SimpleDialog(
contentPadding: EdgeInsets.zero,
children: [
Image.network(widget.pet.imageUrl, fit: BoxFit.fill),
Padding(
...
child: Column(
...
children: [
...
Row(children: [
...
IconButton(
onPressed: () => {
setState(() => {widget.pet.likes++})
},
...
);
}
}
hotReload 一下
可以看到 讚數成功變更了
但是發現了位於Parent Widget(圖片畫面左上角)的讚數卻沒變更
所以我們又要來修改一下程式碼
class Petdialog extends StatefulWidget {
Petdialog({Key key, this.pet, @required this.notifyParent}) : super(key: key);
final Function() notifyParent;
...
}
...
IconButton(
onPressed: () => {
setState(() => {widget.pet.likes++, widget.notifyParent()})
},
icon: Icon(
Icons.thumb_up,
color: Colors.blue,
),
),
....
class _MyPetState extends State<MyPet> {
refresh() {
setState(() {});
}
Widget _dialogBuilder(BuildContext context, Pet pet) {
return Petdialog(
pet: pet,
notifyParent: refresh,
);
}
....
MyPet也改成StatefulWidget
並傳入callbackfn 去更改 清單上的讚數
成功的把讚數binding起來
詳細程式碼可以到我的GitHub上
點此連結
好拉下一篇就會講解 InheritedWidget 是甚麼?
大家ㄅㄅ