Я хочу отобразить изображение файла, которое пользователь выбирает из своей галереи, и может опубликовать его как изображение продукта. Однако у меня были всевозможные проблемы, пытаясь отобразить изображение, и ничего не помогло!
Мое последнее обновление кода меняло способ извлечения изображения из firebase, выполняя это image: File(carData['image']),
, которое каким-то образом устраняло одну из ошибок, которые я получал из-за того, что изображение не отображалось, но я получил другоеошибка знаю, что у меня возникли проблемы с решением, и это дает мне следующую ошибку в моей трассировке стека (после того, как я обновляю свое приложение и пытаюсь получить данные, которые я отправил через форму):
════════ Exception caught by widgets library ═══════════════════════════════════
The following NoSuchMethodError was thrown building CarItem(dirty, dependencies: [_LocalizationsScope-[GlobalKey#6c638], _InheritedTheme, MediaQuery]):
The method '+' was called on null.
Receiver: null
Tried calling: +("58")
Теперь что действительно страннооб этом факте это не вызвало мой файл вообще. он пропустил этот шаг, и из-за того, что он не нашел изображение, он принял значение "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);
}
}
Вот как я называю данные в списке, который отображает все продукты:
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,
),
);
}
}
вот как я закодировал отображение изображения в моем CarItem:
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,
);
},
),
),