Flutter学习Day5 Widget StatelessWidget => StatefulWidget 实作

大家安安 晚上好~~

今天要把专案里的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 是甚麽?
大家ㄅㄅ


<<:  老师!我想知道!如果只使用原生的终端机要怎麽客制化 Prompt 呢!

>>:  Docker for Mac VPN 直通 Container IP 位址

【Day17】Git 版本控制 - 多人协作 Fork(2)

在上一篇笔记中已经提到 Fork 的功能以及使用办法了,那本篇就来实际发个 Pull request...

Day 8-单元测试完善 HelloBank、基础总结与核心技术概述 (基础-7)

单元测试基础的示范专案 HelloBank 收尾与现阶段总结 我们在Day 4-Visual Stu...

前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day8 文章主题列表

连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...

Day 17. 计算属性(Computed) VS 方法(Methods)

昨天介绍了computed的基本使用方式,今天多讲一点点有关methods的, 大家准备好了吗ε٩(...

k8s - 洗掉 kubernetes 环境重新来过

k8s - 洗掉 kubernetes 环境重新来过 参考资料 参考资料:在 Ubuntu 上重新安...