Dart 在flatter中使用Widget的GlobalKey获取Widget的高度
我正在努力使用它的GlobalKey获得一个小部件的高度。 呈现布局后,将调用获取高度的函数,以确保上下文可用,但key.currentState和key.currentContext仍然返回nullDart 在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
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然而,在您的示例中,键不是常量。