Flutter——Key

111 阅读1分钟
  • key的介绍

    key不能重复,一般作为唯一标识,组件更新的时候,其状态的保存主要是通过判断组件的类型或key值是否一致。当各组件的类型不同的时候,类型已经足够用来区分不同的组件了,此时我们可以不用key。当组件存在多个相同的类型的时候,此时就要用用key来区分。
    局部key:
        ValueKey("1")\UniqueKey()\ObjectKey()\LocalKey()
    全局key:
        GlobalKey(key)\GlobalObjectKey(value)
        当组件类型不一致,想要保存组件状态时,可以使用全局key

  • 通过全局key 可以获得子组件属性方法

通过final GlobalKey _globalKey = GlobalKey();设置全局key,将key写入子Widget,child: Box(key: _globalKey, color: Colors.red),即可

获取属性和方法:var boxState = _globalKey.currentState as _BoxState; setState(() { boxState._count++; }); boxState.run();

//获取子widget: var boxWidget = _globalKey.currentWidget as Box;

//获取渲染属性: var renderBox = _globalKey.currentContext!.findRenderObject() as RenderBox;


//父Widget
class HomePage extends StatefulWidget {
  HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final GlobalKey _globalKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          //获取属性和方法
          var boxState = _globalKey.currentState as _BoxState;
          setState(() {
            boxState._count++;
          });
          boxState.run();
          //获取子widget
          var boxWidget = _globalKey.currentWidget as Box;
          //获取渲染属性
          var renderBox =
              _globalKey.currentContext!.findRenderObject() as RenderBox;
          print('------------------------------${renderBox.size}');
        },
        child: const Icon(Icons.add),
      ),
      appBar: AppBar(
        title: const Text("T"),
      ),
      body: Center(
        child: Box(key: _globalKey, color: Colors.red),
      ),
    );
  }
}

//子Widget
class Box extends StatefulWidget {
  final Color color;
  const Box({Key? key, required this.color}) : super(key: key);

  @override
  State<Box> createState() => _BoxState();
}

class _BoxState extends State<Box> {
  int _count = 0;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }

  void run() {
    print("=========================");
  }

  @override
  Widget build(BuildContext context) {
    // print(MediaQuery.of(context).orientation);
    return Container(
      height: 100,
      width: 100,
      child: ElevatedButton(
        style: ButtonStyle(
            backgroundColor: MaterialStateProperty.all(widget.color)),
        onPressed: () {
          setState(() {
            _count++;
          });
        },
        child: Text(
          "$_count",
          style: const TextStyle(color: Colors.white),
        ),
      ),
    );
  }
}
  • MediaQuery.of(context).orientation 获取设备横屏还是竖屏