flutter - Flutter FutureBuilder 获取网络图片时的问题
问题描述
我正在使用FutureBuilder
. 我尝试使用https://stackoverflow.com/a/52021385/7068790。但是图像仍然没有显示。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
late Future<String?> _imageUrl;
@override
void initState() {
super.initState();
_imageUrl = getImage();
}
Future<String?> getImage() async {
Future.delayed(Duration(milliseconds: 2000), () {
return "https://www.google.com/logos/doodles/2021/labour-day-2021-6753651837108920.9-l.png";
});
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _imageUrl,
builder: (context, snapshot) {
if(snapshot.connectionState == ConnectionState.done)
return Image.network(snapshot.data!.toString());
return Container(color: Colors.orange,);
});
}
}
解决方案
您的 getImage 方法不执行任何操作。它缺少 return 语句,因此 _imageUrl 永远不会返回 String 并且只会返回 null。
如果您Future<String?>
在代码中看到,您应该问自己为什么要使用?
. 如果你真的得到一个字符串,Flutter 不会告诉你使用Future<String?>
,但你可以写Future<String>
. 这是 Flutter 新的 null-safety future 的伟大之处,如果您返回 null,它会在这种情况下抱怨。
因此,要修复您的代码,您需要执行以下操作:
Future<String> getImage() async {
return Future.delayed(Duration(milliseconds: 2000), () {
return "https://www.google.com/logos/doodles/2021/labour-day-2021-6753651837108920.9-l.png";
});
推荐阅读
- c# - WPF MVVM 结构中数据源的 XML
- bash - Bash grep 数组作为模式,认为它是一个文件
- c++ - 如何在使用 Boost MSM 编写的状态机中直接达到任何状态
- r - 使用 grand_summary_rows() 创建用户定义的总计
- javascript - 警告:无法执行 React 状态更新
- sql - 使用 Azure 数据流在同一个数据库表中加载两个文件
- android - 为什么我不能向这个 Observable 添加观察者?
- java - EclipseLink 的@OrderCorrection 对订单索引列没有影响
- ssl - 重新签发 SSL 证书但没有 .key 文件
- arrays - Clojure - 对 2D 向量进行垂直切片