首页 > 其他分享 >Flutter Key 以及通过Key获取子组件的状态和方法

Flutter Key 以及通过Key获取子组件的状态和方法

时间:2023-12-21 13:55:21浏览次数:28  
标签:const key color Key 组件 ColorItem Flutter

import 'package:flutter/material.dart';

class ColorItem {
  GlobalKey key;
  Color color;
  //设置子组件的key,这里用的GlobalKey,用来后面获取子组件
  //如果不用获取子组件,也可以用Valuekey
  ColorItem({required this.color}) : key = GlobalKey();
}

class FlutterKey extends StatefulWidget {
  const FlutterKey({super.key});

  @override
  State<FlutterKey> createState() => _FlutterKeyState();
}

class _FlutterKeyState extends State<FlutterKey> {
  List<ColorItem> colorList = [
    ColorItem(color: Colors.cyan),
    ColorItem(color: Colors.pink),
    ColorItem(color: Colors.indigo),
    ColorItem(color: Colors.deepOrangeAccent),
  ];
  List<Widget> colorContainer() {
    return colorList.map((color) {
      return ColorBox(
        color: color.color,
        key: color.key,
      );
    }).toList();
  }

  @override
  Widget build(BuildContext context) {
   
    return Scaffold(
        appBar: AppBar(
          title: const Text('FLutterKey'),
        ),
        body: SizedBox(
          width: double.infinity,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: colorContainer(),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            setState(() {
              for (var color in colorList) {
                //通过GlobalKey 的 key.currentState 获取子组件,能直接更新子组件的状态,调用子组件的方法
                var state = color.key.currentState as _ColorBoxState;
                setState(() {
                  state.num = 0;
                });
              }
            });
          },
          child: const Icon(Icons.refresh),
        ));
  }
}

class ColorBox extends StatefulWidget {
  final Color color;

  const ColorBox({Key? key, required this.color}) : super(key: key);

  @override
  State<ColorBox> createState() => _ColorBoxState();
}

class _ColorBoxState extends State<ColorBox> {
  int num = 0;
  @override
  Widget build(BuildContext context) {
    return Container(
      width: 60,
      height: 60,
      decoration: BoxDecoration(
        color: widget.color,
        borderRadius: BorderRadius.circular(5),
      ),
      // decoration: BoxDecoration(borderRadius: BorderRadius.circular(5)),
      margin: const EdgeInsets.only(bottom: 10),
      child: Center(
        child: TextButton(
          onPressed: () {
            setState(() {
              num++;
            });
          },
          child: Text(
            num.toString(),
            style: const TextStyle(color: Colors.white),
          ),
        ),
      ),
    );
  }
}

标签:const,key,color,Key,组件,ColorItem,Flutter
From: https://www.cnblogs.com/angelwgh/p/17918823.html

相关文章

  • 【UniApp】-uni-app-自定义组件
    前言经过上个章节的介绍,大家可以了解到uni-app-网络请求的基本使用方法那本章节来给大家介绍一下uni-app-自定义组件的基本使用方法原本打算是直接写项目的,在写项目之前还有个内容需要我在码一篇文章,所以就先码这篇文章了本章节的内容比较简单,大家可以快速的过一遍,然后在......
  • React项目中报错:Parsing error: The keyword 'import' is reservedeslint
    记得更改完配置后,要重启编辑器(如:VSCode)!!!记得更改完配置后,要重启编辑器(如:VSCode)!!!记得更改完配置后,要重启编辑器(如:VSCode)!!!这个错误通常发生在你尝试在一个不支持ES6模块语法的环境中使用import关键字。ESLint默认使用的是ES5语法,如果你想使用ES6或者更新的语法,你......
  • Flink处理函数解析(ProcessFunction和KeyedProcessFunction)
    Flink中的处理函数(ProcessFunction和KeyedProcessFunction)在对于数据进行颗粒化的精确计算时使用较多,处理函数提供了一个定时服务(TimerService),可以向未来注册一个定时服务,我们可以把它理解为一个闹钟,当闹钟响起时,就调用ProcessFunction中的onTimer()方法,会对数据进行一些计算。我......
  • 鸿蒙开发之系统基础组件
    应用page的组成部分是组件组成的,系统提供了很多的组件Image/TextImage组件Image($r('app.media.logo')).width(78).height(509)使用string设置.width('78vp')//vpvm的像素单位使用定义资源json.width($r('app.float.logo_size'))在resources目录下......
  • 鸿蒙开发之容器组件
    容器组件类似于flex的布局,不过这里是固定Column是纵向Row是横向 当然,也提供了很多的flex相关的属性封装如何设置?第一种是Row(){Text($r(…))Text($r(…))}.justifyContent(FlexAlign.SpaceBetween)//在属性上设置.width('100%') 第二种是//......
  • ICEE-Keyboard- 键盘工作原理:扫描GPIO:{X行,Y列}感应点矩阵在按键触发点感应电路{x,y
    ICEE-Keyboard-键盘工作原理:周期性扫描电路感应点矩阵:电路感应点矩阵有总共X行与总共Y列的电路感应{电容式,电阻式,开关式}点,例如总共12行,总共12列;则总共有144个键位点;电路感应点矩阵的每一行或每一列都有一条电路线直连MCU的一个GPIO;例如总共12行,总共12列;则总共需......
  • Redis7 BigKey
    1、MoreKey1.1、大数据模拟往redis插入大量数据进行测试for((i=1;i<=100*10000;i++));doecho"setk$iv$i">>/tmp/redisTest.txt;done;通过redis提供的管道--pipe命令插入100W大批量数据cat/tmp/redisTest.txt|/opt/redis-7.0.0/src/redis-cli-h127.0.0.1-p6379-a......
  • 想要深入学习Flutter,这篇文章让你一步到位
    前言Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面一份代码可以同时生成iOS和Android两个高性能、高保真的应用程序Flutter目标就是使开发人员能够交付在不同平台上都感觉自然流畅的高性能应用程序,并且兼容滚动行为、排版、图标等方面的......
  • iOS项目中加入flutter
    新建一个iOS项目Test在iOS同级目录下建一个flutter modulefluttercreate--templatemodulemy_flutterpodfile编写如下#Uncommentthenextlinetodefineaglobalplatformforyourproject#platform:ios,'9.0'target'Test'do#Commentthenextl......
  • Flutter 使用PageView 自定义无限轮播
    import'package:flutter/material.dart';int_getRealIndex(intindex,intlength){returnindex>=length?index%length:index;}classInfinitySliderextendsStatefulWidget{finalintinitialPage;finalList<Widget>items;......