Хранение изображения в базе данных - PullRequest
0 голосов
/ 28 октября 2019

Итак, я уже несколько раз спрашивал об этом и пробовал несколько строк кода, предложенных людьми, но со мной пока ничего не получалось. На этот раз я предоставлю больше информации, чтобы дать вам, ребята, идею.

Так что у меня есть страница «Создать продукт» в моем приложении для этой конкретной страницы «Автомобиль», когда пользователь готовотправляя все свои данные в TextFormFIelds, данные отправляются на Firebase, но проблема в том, что я не получаю предоставленное мной изображение, и я продолжаю получать сообщение об ошибке. Идея этого Image заключается в ImagePicker, где пользователь может выбрать изображение из своей «Галереи» и опубликовать его как «Автомобиль», который он отправляет.

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

Я просто покажу, как я вызываю мои данные Image через приложение, поскольку все остальное работает нормально. .

Но когда они отправляются, я получаю эту ошибку:

════════ Exception caught by gesture ═══════════════════════════════════════════
The following JsonUnsupportedObjectError was thrown while handling a gesture:
Converting object to an encodable object failed: Instance of '_File'

Вот как настроен мой провайдер:

class AddCar {
  // Other data
  File image;

вот как выглядит мой URL-адрес Firebase-кода(используется для извлечения и хранения данных):

Future<void> fetchAndSetCars() async {
    const url = 'https://#######.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(
          // Other data
          image: carData['image'],
        ));
      });
      _cars = loadedCars;
      notifyListeners();
    } catch (error) {
      throw (error);
    }
  }

  AddCar findById(String id) {
    return _cars.firstWhere((carProd) => carProd.id == id);
  }

  void addCar(AddCar car) {
    const url = 'https://#######.firebaseio.com/cars.json';
    http.post(
      url,
      body: json.encode({
       // other data
        'image': car.image.toString(),
      }),
    );
    final newCar = AddCar(
      // Other data
      image: car.image,
    );
    _cars.insert(0, newCar); // add car at the top of the list

    notifyListeners();
  }

вот как я отображаю Image в моем приложении:

 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,
                    );
                  },
                ),
              ),

, а вот мой ImagePicker код:

import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart' as syspaths;


Future<void> _takePicture() async {
    final imageFile = await ImagePicker.pickImage(
      source: ImageSource.gallery,
    );
    setState(() {
      data.image = imageFile;
    });
    final appDir = await syspaths.getApplicationDocumentsDirectory();
    String fileName = path.basename(imageFile.path);
    final savedImage = await imageFile.copy('${appDir.path}/$fileName');
  }

и я вызываю метод следующим образом (который прекрасно работает):

onPressed: _takePicture;
...