Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 在flatter中使用Widget的GlobalKey获取Widget的高度_Dart_Flutter - Fatal编程技术网

Dart 在flatter中使用Widget的GlobalKey获取Widget的高度

Dart 在flatter中使用Widget的GlobalKey获取Widget的高度,dart,flutter,Dart,Flutter,我正在努力使用它的GlobalKey获得一个小部件的高度。 呈现布局后,将调用获取高度的函数,以确保上下文可用,但key.currentState和key.currentContext仍然返回null import 'package:flutter/material.dart'; class TestPage extends StatefulWidget{ @override State<StatefulWidget> createState() => new Tes

我正在努力使用它的GlobalKey获得一个小部件的高度。 呈现布局后,将调用获取高度的函数,以确保上下文可用,但key.currentState和key.currentContext仍然返回null

import 'package:flutter/material.dart';

class TestPage extends StatefulWidget{
  @override
  State<StatefulWidget> createState() => new TestPageState();
}

class TestPageState extends State<TestPage>{
  final TestWidget testWidget = new TestWidget();

  @override
  initState() {
    //calling the getHeight Function after the Layout is Rendered
    WidgetsBinding.instance
        .addPostFrameCallback((_) => getHeight());

    super.initState();
  }

  void getHeight(){
    final GlobalKey key = testWidget.key;

    //returns null:
    final State state = key.currentState;
    //returns null:
    final BuildContext context = key.currentContext;

    //Error: The getter 'context' was called on null.
    final RenderBox box = state.context.findRenderObject();

    print(box.size.height);
    print(context.size.height);
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: testWidget,
    );
  }
}

class TestWidget extends StatefulWidget{
  @override
  Key get key => new GlobalKey<TestWidgetState>();

  @override
  State<StatefulWidget> createState() => new TestWidgetState();
}

class TestWidgetState extends State<TestWidget>{
  @override
  Widget build(BuildContext context) {
    return new Container(
      child: new Text("Test", style: const TextStyle(fontSize: 32.0, fontWeight: FontWeight.bold),),
    );
  }
}
导入“包装:颤振/材料.省道”;
类TestPage扩展了StatefulWidget{
@凌驾
State createState()=>新建TestPageState();
}
类TestPageState扩展了状态{
final TestWidget TestWidget=新建TestWidget();
@凌驾
initState(){
//在呈现布局后调用getHeight函数
WidgetsBinding.instance
.addPostFrameCallback((\u)=>getHeight());
super.initState();
}
void getHeight(){
最终GlobalKey=testWidget.key;
//返回空值:
最终状态=key.currentState;
//返回空值:
最终构建上下文=key.currentContext;
//错误:对null调用了getter“context”。
final RenderBox=state.context.findenderObject();
打印(框、尺寸、高度);
打印(上下文、大小、高度);
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
正文:testWidget,
);
}
}
类TestWidget扩展了StatefulWidget{
@凌驾
Key get Key=>new GlobalKey();
@凌驾
State createState()=>新建TestWidgetState();
}
类TestWidgetState扩展了状态{
@凌驾
小部件构建(构建上下文){
退回新货柜(
子项:新文本(“测试”,样式:常量文本样式(fontSize:32.0,fontWeight:fontWeight.bold),
);
}
}

您需要使用小部件构造函数中的
super
将该键分配给小部件。不将其添加为字段。
也必须是常量

import 'package:flutter/material.dart';

class TestPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new TestPageState();
}

class TestPageState extends State<TestPage> {
  final key = new GlobalKey<TestWidgetState>();

  @override
  initState() {
    //calling the getHeight Function after the Layout is Rendered
    WidgetsBinding.instance.addPostFrameCallback((_) => getHeight());

    super.initState();
  }

  void getHeight() {
    //returns null:
    final State state = key.currentState;
    //returns null:
    final BuildContext context = key.currentContext;

    //Error: The getter 'context' was called on null.
    final RenderBox box = state.context.findRenderObject();

    print(box.size.height);
    print(context.size.height);
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new TestWidget(key: key),
    );
  }
}

class TestWidget extends StatefulWidget {
  TestWidget({Key key}) : super(key: key);

  @override
  State<StatefulWidget> createState() => new TestWidgetState();
}

class TestWidgetState extends State<TestWidget> {
  @override
  Widget build(BuildContext context) {
    return new Container(
      child: new Text(
        "Test",
        style: const TextStyle(fontSize: 32.0, fontWeight: FontWeight.bold),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
类TestPage扩展了StatefulWidget{
@凌驾
State createState()=>新建TestPageState();
}
类TestPageState扩展了状态{
final key=new GlobalKey();
@凌驾
initState(){
//在呈现布局后调用getHeight函数
WidgetsBinding.instance.addPostFrameCallback((\u)=>getHeight());
super.initState();
}
void getHeight(){
//返回空值:
最终状态=key.currentState;
//返回空值:
最终构建上下文=key.currentContext;
//错误:对null调用了getter“context”。
final RenderBox=state.context.findenderObject();
打印(框、尺寸、高度);
打印(上下文、大小、高度);
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
正文:新的TestWidget(key:key),
);
}
}
类TestWidget扩展了StatefulWidget{
TestWidget({Key}):超级(Key:Key);
@凌驾
State createState()=>新建TestWidgetState();
}
类TestWidgetState扩展了状态{
@凌驾
小部件构建(构建上下文){
退回新货柜(
儿童:新文本(
“测试”,
样式:常量文本样式(fontSize:32.0,fontWeight:fontWeight.bold),
),
);
}
}

如下定义您的构造函数:

constmywidget(GlobalKey):super(key:key)


框架将
BuildContext
State
对象存储在
Widget.key
字段中,该字段由构造函数而不是任意
key
字段传递到对象中。

上述代码给出了此错误//错误:getter“context”被调用为null。@AsadJamil如果您试图通过
runApp运行它(TestPage());
,它将返回此错误,但如果您将TestPage包装在MediaQuery和方向性小部件(提供了数据和textDirection参数)或MaterialApp或WidgetsApp小部件中,它应该运行(至少对我来说是这样)。@AsadJamil然而,在您的示例中,键不是常量。