尝试获取其大小时容器 "vanishes" 的键

key of Container "vanishes" when trying to get its size

我正在尝试获取具有通常有效的功能的容器的大小。根据调试器,现在它失败了,因为它无法在小部件树中找到容器的键。错误是 The method 'findRenderObject' was called on null。 Receiver: null 我确实在 getSize() 中看到了密钥,但是当进入错误抛出行时,我发现如果返回 null 则无法找到小部件的解释。知道为什么会这样吗?

import 'package:flutter/material.dart';

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatefulWidget {
 @override
  _MyWidgetState createState() => _MyWidgetState();
}


class _MyWidgetState extends State<MyWidget>  {
  GlobalKey _keyScreenContainer = GlobalKey(); // <-------- key declared
   @override
  Widget build(BuildContext context) {
    return SafeArea(
          child: Container(
            key: _keyScreenContainer,         // <--------- key allocated
            width: 20, height: 20,
            child: Text("${getSize(_keyScreenContainer, context)}"),
            )
      );
  }
  
  Size getSize(GlobalKey _key, BuildContext context) {
    final RenderBox renderBox = _key.currentContext.findRenderObject(); // <---- error
    final boxSize = renderBox.size;
    print (boxSize);
    return boxSize;
  }
}

错误是因为您甚至在构建完成之前就调用了 getSize 函数。一旦小部件布局完成,您可以在 initState 中使用 WidgetsBinding.instance 调用该函数 .addPostFrameCallback((_) => someFunction()) 或使用按钮之类的东西。请看下面的代码:

import 'package:flutter/material.dart';

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatefulWidget {
 @override
  _MyWidgetState createState() => _MyWidgetState();
}


class _MyWidgetState extends State<MyWidget>  {
  GlobalKey _keyScreenContainer = GlobalKey();
  
  @override
  void initState(){
    
            super.initState();
    
    WidgetsBinding.instance
        .addPostFrameCallback((_) => print("${getSize(_keyScreenContainer, context)}"));
    
  }
   @override
  Widget build(BuildContext context) {
    return Column(children: [
          Container(
            key: _keyScreenContainer,     
            width: 20, height: 20,
            child: Text("abc"),
      ), RaisedButton(onPressed:(){
            print("${getSize(_keyScreenContainer, context)}");
            
            
          },child:Text("Get size"))]);
  }
  
  Size getSize(GlobalKey key, BuildContext context) {
    final RenderBox renderBox = key.currentContext.findRenderObject(); // <---- error
    final boxSize = renderBox.size;
    print (boxSize);
    return boxSize;
  }
}