Отправить фото в формате 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),
),
);
}
}