Image 从Firebase获取图像文件数据时出错
我想显示一个文件图像,用户可以从他们的图库中选择并将其作为产品图像发布。然而,我一直有各种各样的问题,试图显示图像,但没有任何工作 我的最新代码更新更改了从firebase获取图像的方式,方法是执行以下操作Image 从Firebase获取图像文件数据时出错,image,firebase,flutter,dart,error-handling,Image,Firebase,Flutter,Dart,Error Handling,我想显示一个文件图像,用户可以从他们的图库中选择并将其作为产品图像发布。然而,我一直有各种各样的问题,试图显示图像,但没有任何工作 我的最新代码更新更改了从firebase获取图像的方式,方法是执行以下操作Image:File(carData['Image']),在某种程度上消除了由于图像未显示而导致的一个错误,但我发现了另一个错误,即我在解决问题时遇到了问题,它在stacktrace中给了我以下错误(在我刷新应用程序并尝试获取通过表单提交的数据后): 现在真正奇怪的是,它根本没有调用我的文件。
Image:File(carData['Image']),
在某种程度上消除了由于图像未显示而导致的一个错误,但我发现了另一个错误,即我在解决问题时遇到了问题,它在stacktrace中给了我以下错误(在我刷新应用程序并尝试获取通过表单提交的数据后):
现在真正奇怪的是,它根本没有调用我的文件。它跳过了这一步,由于找不到图像,它获取了我在应用程序中构建的“Price”textFormField
的值
以下是我使用firebase获取数据的过程:
Future<void> fetchAndSetCars() async {
const url = 'https://mylink.firebaseio.com/cars.json';
try {
final response = await http.get(url);
final extractedData = json.decode(response.body) as Map<String, dynamic>;
final List<AddCar> loadedCars = [];
extractedData.forEach((carId, carData) {
loadedCars.add(AddCar(
id: carId,
name: carData['name'],
city: carData['city'],
country: carData['country'],
currencyT: carData['currency'],
price: carData['price'],
// date: carData['date'],
sponsNum: carData['sponsNum'],
category: carData['category'],
company: carData['company'],
model: carData['model'],
year: carData['year'],
engine: carData['engine'],
distanceCovered: carData['distanceCovered'],
transmission: carData['transmission'],
oilT: carData['oil type'],
outColor: carData['outter color'],
inColor: carData['inner color'],
description: carData['description'],
address: carData['address'],
image: File(carData['image']),
));
});
_cars = loadedCars;
notifyListeners();
} catch (error) {
throw (error);
}
}
你在
carData['image']
中有URL
吗?不完全是一个更像路径的URL这是传递到firebase'image
数据文件:'/storage/emulated/0/Android/data/com.exa…
中的文件,你确定该文件在该位置的设备上吗?首先我不知道Image.file()是否可以处理文件:/prefix,然后我很确定您需要android.permission.READ\u EXTERNAL\u存储权限。我认为这样做没有用。为什么不将其存储在云存储中,并将下载URL保存在firebase中?我花了20分钟来实现。但是堆栈似乎与加载图像无关,而且我不理解CarItem代码块。这是无状态小部件的构建方法的一部分还是什么?有趣的是,人们在代码中粘贴与所有属性和内容无关的内容,却忽略了重要的部分。CarItem是应用程序中数据的显示方式。基本上,它会将图像作为产品的预览图像放在CarItem中
Future<void> fetchAndSetCars() async {
const url = 'https://mylink.firebaseio.com/cars.json';
try {
final response = await http.get(url);
final extractedData = json.decode(response.body) as Map<String, dynamic>;
final List<AddCar> loadedCars = [];
extractedData.forEach((carId, carData) {
loadedCars.add(AddCar(
id: carId,
name: carData['name'],
city: carData['city'],
country: carData['country'],
currencyT: carData['currency'],
price: carData['price'],
// date: carData['date'],
sponsNum: carData['sponsNum'],
category: carData['category'],
company: carData['company'],
model: carData['model'],
year: carData['year'],
engine: carData['engine'],
distanceCovered: carData['distanceCovered'],
transmission: carData['transmission'],
oilT: carData['oil type'],
outColor: carData['outter color'],
inColor: carData['inner color'],
description: carData['description'],
address: carData['address'],
image: File(carData['image']),
));
});
_cars = loadedCars;
notifyListeners();
} catch (error) {
throw (error);
}
}
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:google_fonts_arabic/fonts.dart';
import '../providers/car_provider.dart';
import '../widget/car_item.dart';
class CarsList extends StatefulWidget {
@override
_CarsListState createState() => _CarsListState();
}
class _CarsListState extends State<CarsList> {
@override
void initState() {
Future.delayed(Duration.zero).then((_) {
Provider.of<Cars>(context).fetchAndSetCars();
});
super.initState();
}
@override
Widget build(BuildContext context) {
final carsData = Provider.of<Cars>(context);
final car = carsData.cars;
return car.isEmpty
? Center(
child: Text(
'error no car found',
style: TextStyle(
fontFamily: ArabicFonts.Tajawal,
fontWeight: FontWeight.bold,
package: 'google_fonts_arabic',
),
))
: ListView.builder(
padding: const EdgeInsets.only(bottom: 47.0),
itemCount: car.length,
itemBuilder: (ctx, i) => CarItem(
car[i].id,
car[i].image,
car[i].name,
car[i].model,
car[i].currencyT,
car[i].price,
car[i].distanceCovered,
car[i].transmission,
car[i].oilT,
car[i].year,
car[i].date,
),
);
}
}
final String id;
final File image;
final String name;
final String model;
final String currencyT;
final String price;
final double distanceCovered;
final String transmission;
final String oilT;
final String year;
final DateTime date;
CarItem(
this.id,
this.image,
this.name,
this.model,
this.currencyT,
this.price,
this.distanceCovered,
this.transmission,
this.oilT,
this.year,
this.date,
);
Container(
width: MediaQuery.of(context).size.width * 0.35,
height: MediaQuery.of(context).size.width * 0.35,
child: GestureDetector(
child: Image.file(
image,
fit: BoxFit.fill,
),
onTap: () {
Navigator.of(context).pushNamed(
MyCarDetails.routeName,
arguments: id,
);
},
),
),