【发布时间】:2021-10-23 01:45:30
【问题描述】:
我正在尝试在加载图像并且小部件已呈现时获取图像的大小。
所以,如果在initState 中调用_getSizes() 函数,它会返回width: 0.0, height: 0.0。
当我在frameBuilder 中调用_getSizes() 时,结果相同。
现在,如果我单击 floatingActionButton 或使用 Future.delayed 至少延迟 500 毫秒,我可以从 _getSizes() 函数获得所需的结果,然后它会打印实际容器大小:width: 375.0, height: 210.9375
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({ Key? key }) : super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final GlobalKey _imgKey = GlobalKey();
_getSizes() {
final RenderBox renderBox = _imgKey.currentContext!.findRenderObject() as RenderBox;
final boxSize = renderBox.size;
print("width: ${boxSize.width}, height: ${boxSize.height}");
}
@override
void initState() {
super.initState();
WidgetsBinding.instance!.addPostFrameCallback((_) {
print("WidgetsBinding");
_getSizes();
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Test Image Load',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Image Asset Load'),
),
body: Center(
child: Container(
key: _imgKey,
child: Image.asset(
'assets/images/landscape_big.jpg',
frameBuilder: (BuildContext context, Widget child, int? frame, bool wasSynchronouslyLoaded) {
if (wasSynchronouslyLoaded) {
print('wasSynchronouslyLoaded');
}
if (frame != null) {
_getSizes();
}
return child;
}
),
)
),
floatingActionButton: FloatingActionButton(
onPressed: () {
_getSizes();
},
child: const Icon(Icons.update),
backgroundColor: Colors.green,
),
)
);
}
}
加载图片资源并渲染父容器时如何获取实际大小?是否有任何onLoad 方法或Image.assets 小部件的控制器?
【问题讨论】:
-
This 你在找什么。
-
感谢您的链接。这种方法有助于部分解决这个问题。
Completer给出原始图像大小,但不是布局中Image小部件的实际大小。同样在Completer返回原始图像大小的那一刻,RenderBox仍然返回零。这样即使原始图像尺寸已知,Flutter 也没有时间计算实际的小部件尺寸。我不知道为什么会这样,这不好。至少我可以借助来自Completer的已知纵横比来计算高度,但如果您不知道任何布局尺寸,这将是不可能的。