iT邦幫忙

0

Flutter學習Day5 Widget StatelessWidget => StatefulWidget 實作

  • 分享至 

  • xImage
  •  

大家安安 晚上好~~

今天要把專案裡的StatelessWidget 更改成為 StatefulWidget
我想要加入點讚的功能去計算我的寵物的讚數

首先我們先加入按讚的按鈕
及顯示的的讚數

https://ithelp.ithome.com.tw/upload/images/20201025/20131298eCRwQLA5Um.png

程式碼的部分則加入一段

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 是甚麼?
大家ㄅㄅ


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言