尝试获取其大小时容器 "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;
}
}
我正在尝试获取具有通常有效的功能的容器的大小。根据调试器,现在它失败了,因为它无法在小部件树中找到容器的键。错误是 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;
}
}