Отправить фото в формате base64 в Post Request в flutter

Я создал форму в которой я выбираю данные из всплывающего списка (данные забирает методом гет) и на основе этих данных делаю Посст запрос. Чтобы эти данные записать в базу данных. Но у меня возникла проблема. Я бы хотел отсылать этим данным и Фото какая я сделаю с помощью камеры. Это фото я бы хотел отправлять в формате бейс64. Я код формы. А также я написал код который делает фото. У меня возникло 2 проблемы. 1 - Я не могу превратить фото с камеры в формат бейс64. 2 - я не могу объединить эти фонкционалы в одной форме (выбор данных из всплывающих Спика, и сделанной фото) Буду благодарен за помощь!

import 'dart:convert';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:async';
import 'package:barcode_scan/barcode_scan.dart';
import 'package:flutter/services.dart';
void main() => runApp(Form_seals());

class Form_seals extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SealsPage(),
    );
  }
}

class SealsPage extends StatefulWidget {
  @override
  _SealsPageState createState() => _SealsPageState();
}

class _SealsPageState extends State<SealsPage> {
  String _myType;

  String url = 'MyUrl';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dynamic  REST API'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.start,
        children: <Widget>[
          Container(
            alignment: Alignment.topCenter,
            margin: EdgeInsets.only(bottom: 100, top: 100),
            child: Text(
              'Type seals',
              style: TextStyle(fontWeight: FontWeight.w800, fontSize: 20),
            ),
          ),
          //======================================================== State

          Container(
            padding: EdgeInsets.only(left: 15, right: 15, top: 5),
            color: Colors.white,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Expanded(
                  child: DropdownButtonHideUnderline(
                    child: ButtonTheme(
                      alignedDropdown: true,
                      child: DropdownButton<String>(
                        iconSize: 30,
                        icon: (null),
                        style: TextStyle(
                          color: Colors.black54,
                          fontSize: 16,
                        ),
                        hint: Text("Тип пломбування"),
                        onChanged: (String newValue) {
                          setState(() {
                            _myType = newValue;
                            _getObjectList();
                            _getSealsList();
                            print(_myType);
                          });
                        },
                        items: <String>['Пломбування', 'Розпломбування']
                            .map<DropdownMenuItem<String>>((String value) {
                          return DropdownMenuItem<String>(
                            value: value,
                            child: Text(value),

                          );
                        })?.toList() ??
                            [],
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
          SizedBox(
            height: 30,
          ),

          //======================================================== City

          Container(
            padding: EdgeInsets.only(left: 15, right: 15, top: 5),
            color: Colors.white,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Expanded(
                  child: DropdownButtonHideUnderline(
                    child: ButtonTheme(
                      alignedDropdown: true,
                      child: DropdownButton<String>(
                        value: _myObject,
                        iconSize: 30,
                        icon: (null),
                        style: TextStyle(
                          color: Colors.black54,
                          fontSize: 16,
                        ),
                        hint: Text("Об'єкт пломбування"),
                        onChanged: (String newValue) {
                          setState(() {
                            _myObject = newValue;
                            print(_myObject);
                          });
                        },
                        items: ObjectList?.map((item) {
                          return new DropdownMenuItem(
                            child: new Text(item['name']),
                            value: item['name'].toString(),
                          );
                        })?.toList() ??
                            [],
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
          SizedBox(
            height: 30,
          ),
          Container(
            padding: EdgeInsets.only(left: 15, right: 15, top: 5),
            color: Colors.white,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Expanded(
                  child: DropdownButtonHideUnderline(

                    child: ButtonTheme(
                      alignedDropdown: true,
                      child: DropdownButton<String>(
                        value: _mySeals,
                        iconSize: 30,
                        icon: (null),
                        style: TextStyle(
                          color: Colors.black54,
                          fontSize: 16,
                        ),
                        hint: Text("Пломби"),
                        onChanged: (String newValue) {
                          setState(() {
                            _mySeals = newValue;
                            print(_mySeals);
                          });
                        },
                        items: SealsList?.map((item) {
                          return new DropdownMenuItem(
                            child: new Text(item['seal_number']),
                            value: item['seal_number'].toString(),
                          );
                        })?.toList() ??
                            [],
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
          Container(
              padding: EdgeInsets.only(left: 15, right: 15, top: 5),
              color: Colors.white,
              child: new RaisedButton(
                child: new Text('Створити пломбування'),
                onPressed: makeRequest,
              )
          ),

        ],
      ),
    );
  }

  //=============================================================================== Api Calling here

//CALLING STATE API HERE
// Get State information by API (object)

  List ObjectList;
  String _myObject;

  Future<String> _getObjectList() async {
    await http.get(url+'/ords/seals/SEALS/object_list').then((response) {
      var data = json.decode(response.body);
      setState(() {
        ObjectList = data;
      });
    });
  }

  // Get State information by API (seals)
  List SealsList;
  String _mySeals;


  Future<String> _getSealsList() async {
    await http.get(url+'/ords/seals/SEALS/seals_list').then((response) {
      var dataList = json.decode(response.body);
      setState(() {
        SealsList = dataList;
      });
    });
  }

  //Post seals/unseals

  Future<String> makeRequest() async {
    var response = await http
        .post(Uri.encodeFull(url+'/ords/seals/SEALS/seals_object'), body: json.encode(
        {
          "seals": _mySeals,
          "data_area": "4000",
          "object": _myObject,
          "type": _myType,
          "image": _Base64
          ,
          "lang": "42.2422523",
          "lati": "22.2422523"
        }), headers: { "content-type": "application/json",
      "accept": "application/json"});
  }
  var result;


}

Мой код для загрузки фото через камеру:

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';
import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
void main() {
  runApp(MyApp());

}
class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context){
    return MaterialApp(
      home: HomePage(),
    );
  }
}
class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  File _image;
  final imagePicker = ImagePicker();
  Future getImage() async{
    final image = await imagePicker.getImage(source: ImageSource.camera);

    setState(() {
      _image = File(image.path);
      //String img64 = base64Encode(image);
    });
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
          child: _image == null ? Text("Зображення не знайдено") : Image.file(_image)),
      floatingActionButton: FloatingActionButton(
        onPressed: getImage,
        backgroundColor: Colors.blue,
        child: Icon(Icons.camera_alt),

      ),
    );
  }
}


Ответы (0 шт):