Ошибка при загрузке данных файла изображения из Firebase - PullRequest
0 голосов
/ 28 октября 2019

Я хочу отобразить изображение файла, которое пользователь выбирает из своей галереи, и может опубликовать его как изображение продукта. Однако у меня были всевозможные проблемы, пытаясь отобразить изображение, и ничего не помогло!

Мое последнее обновление кода меняло способ извлечения изображения из 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,
                    );
                  },
                ),
              ),

...