【发布时间】:2020-04-05 08:45:33
【问题描述】:
我想在显示图像之前从NetworkImage 或Image.network 获取属性值,例如宽度和高度。
我找到了以下好帖子,但它不起作用。它得到了大小值,但图像没有加载到FutureBuilder。
- How do I determine the width and height of an image in Flutter?
- How do I tell when a NetworkImage has finished loading?
我的代码如下;
import 'dart:async';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: FutureBuilder(
future: _getImage(),
builder: (BuildContext context, AsyncSnapshot<Image> snapshot) {
print(snapshot.hasData);
if (snapshot.hasData) {
return snapshot.data;
} else {
return Text('Loading...');
}
},
),
),
);
}
Future<Image> _getImage() async {
final Completer completer = Completer();
final String url = 'http://images-jp.amazon.com/images/P/4101098018.09.MZZZZZZZ';
final image = NetworkImage(url);
image.resolve(ImageConfiguration())
.addListener(ImageStreamListener((ImageInfo info, bool isSync) {
print(info.image.width);
completer.complete(info.image);
}));
return completer.future;
}
}
结果是;
- 屏幕只显示“正在加载...”,图像未加载。
- print 输出如下。这应该意味着,FutureBuilder 在加载图像之前被调用了两次,我们可以获得宽度,但之后不会调用FutureBuilder。
false
false
112
环境:
- Flutter 1.13.0 • 频道开发(由于 Flutter Web)
- Chrome 版本 79.0.3945.79
【问题讨论】:
-
使用您选择的 HTTP 包自行下载图像,提取尺寸信息,然后使用
Image.memory显示它。 -
感谢您的建议。我会这样调查。同时,我仍然想知道为什么上述方法不起作用。
标签: flutter dart flutter-web