Flutter 图像选择器未上载图像,它将向后端发送空值
我在那个页面上有一个页面,有一个添加按钮,它会添加用户想要的小部件,但当我上传图像时,它不会上传。当我按下add按钮时,它已经将图像上传到下一个生成的小部件上。而且它也没有给我这些图像的价值 这是一张图片,它会在点击图片添加按钮后上传图片,但不会上传。而且,当我添加multipart时,它会将值作为null发送到后端 这是我试过的代码Flutter 图像选择器未上载图像,它将向后端发送空值,flutter,dart,flutter-layout,flutter-dependencies,imagepicker,Flutter,Dart,Flutter Layout,Flutter Dependencies,Imagepicker,我在那个页面上有一个页面,有一个添加按钮,它会添加用户想要的小部件,但当我上传图像时,它不会上传。当我按下add按钮时,它已经将图像上传到下一个生成的小部件上。而且它也没有给我这些图像的价值 这是一张图片,它会在点击图片添加按钮后上传图片,但不会上传。而且,当我添加multipart时,它会将值作为null发送到后端 这是我试过的代码 class BspUnlicensedSignupPage extends StatefulWidget { static const String rou
class BspUnlicensedSignupPage extends StatefulWidget {
static const String routeName = "/bspUnlicensedSignup";
final BspSignupCommonModel bspSignupCommonModel;
BspUnlicensedSignupPage({
Key key,
@required this.bspSignupCommonModel,
}) : super(key: key);
@override
_BspUnlicensedSignupPageState createState() =>
_BspUnlicensedSignupPageState();
}
class _BspUnlicensedSignupPageState extends State<BspUnlicensedSignupPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
List<Object> images = List<Object>();
Future<File> _imageFile;
bool autovalidate = false;
bool informationislegitimate = false;
DateTime expirydate1 = DateTime.now();
DateTime expirydate2 = DateTime.now();
final format = DateFormat("yyyy-MM-dd");
final format2 = DateFormat("yyyy-MM-dd");
String type2 = 'Passport';
List<String> _type = <String>[
'',
'Passport',
'Driving License',
'Voter ID card',
'Ration Card',
'Aadhar',
'Other Id',
];
String type = 'Passport';
// Map<String, String> _formdata = {};
var _myWidgets = List<Widget>();
int _index = 1;
final Map<int, String> identification1Values = Map();
final Map<int, String> documentValues = Map();
final Map<int, DateTime> expiryDateValues = Map();
final Map<int, String> issuingAuthority = Map();
final Map<int, String> identificationPicturesValues = Map();
final List<TextEditingController> _documentControllers = List();
final List<TextEditingController> _issuingauthoritytype = List();
final List<TextEditingController> _expiryDate = List();
final List<TextEditingController> _issuingauthority = List();
final List<List<Object>> _identificationpictures = List();
@override
void initState() {
super.initState();
setState(() {
images.add("Add Image");
images.add("Add Image");
images.add("Add Image");
images.add("Add Image");
images.add("Add Image");
});
}
void _add() {
// TextEditingController controller = TextEditingController();
setState(() {
int keyValue = _myWidgets.length;
_myWidgets = List.from(_myWidgets)
..add(Column(
key: Key("$keyValue"),
children: <Widget>[
SizedBox(height: 10),
Container(
// padding: EdgeInsets.fromLTRB(18,5,18,18),
padding: EdgeInsets.all(15),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
boxShadow: [
BoxShadow(
color: Colors.black12,
blurRadius: 15,
),
],
),
child: Column(
children: <Widget>[
Stack(
children: <Widget>[
Align(
alignment: Alignment.topRight,
child: GestureDetector(
child: Icon(Icons.close),
onTap: () {
print("CLose pressed");
setState(() {
_myWidgets = List.from(_myWidgets)
..removeAt(keyValue);
});
},
),
),
SizedBox(
height: 10,
),
Column(
children: <Widget>[
SizedBox(
height: 20,
),
_buildidentificationtype1(keyValue),
_builddocumentnumber1(keyValue),
_builddate(keyValue),
_buildissuingauthority1(keyValue),
_buildidentificationpictures(keyValue),
],
),
],
)
],
),
)
],
));
});
}
bool isClicked = false;
Widget _buildidentificationtype1(int keyValue) {
TextEditingController controller = TextEditingController();
_issuingauthoritytype.add(controller);
return FormBuilder(
autovalidate: autovalidate,
child: FormBuilderCustomField(
attribute: "Business type",
validators: [FormBuilderValidators.required()],
formField: FormField(
builder: (FormFieldState<dynamic> field) {
return InputDecorator(
decoration: InputDecoration(
prefixIcon: Icon(Icons.location_on),
labelText : 'Business type',
),
isEmpty: type == '',
child: new DropdownButtonHideUnderline(
child: new DropdownButton(
value: type,
isDense: true,
onChanged: (String newValue) {
setState(() {
type = controller.text = newValue;
field.didChange(newValue);
});
},
items: _type.map(
(String value) {
return new DropdownMenuItem(
value: value,
child: new Text(value),
);
},
).toList(),
),
),
);
},
)),
);
}
Widget _builddocumentnumber1(int keyValue) {
TextEditingController controller = TextEditingController();
_documentControllers.add(controller);
return new TudoTextWidget(
controller: controller,
prefixIcon: Icon(FontAwesomeIcons.idCard),
labelText : 'Document Number'
onSaved: (val) {
setState(() {
documentValues[keyValue] = val;
});
// _licenseno = val;
},
);
}
Widget _builddate(int keyValue) {
TextEditingController controller = TextEditingController();
_expiryDate.add(controller);
return DateTimeField(
format: format,
autocorrect: true,
autovalidate: autovalidate,
controller: controller,
readOnly: true,
// validator: (date) => date == null ? 'Please enter valid date' : null,
decoration: InputDecoration(
labelText: "Expiry Date",
hintText: "Expiry Date",
prefixIcon: Icon(
FontAwesomeIcons.calendar,
size: 24,
)),
onShowPicker: (context, currentValue) {
return showDatePicker(
context: context,
firstDate: DateTime.now(),
initialDate: currentValue ?? DateTime.now(),
lastDate: DateTime(2100));
},
);
}
Widget _buildissuingauthority1(int keyValue) {
TextEditingController controller = TextEditingController();
_issuingauthority.add(controller);
return new TudoTextWidget(
prefixIcon: Icon(FontAwesomeIcons.idCard),
labelText: 'Issuning authority',
validator: (val) => Validators.validateName(val, "Issuing Authority"),
onSaved: (val) {
setState(() {
issuingAuthority[keyValue] = val;
});
// _illusingauthority = issuingAuthority[keyValue] = val;
},
controller: controller,
);
}
Widget _buildidentificationpictures(int keyValue) {
return GridView.count(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
crossAxisCount: 5,
childAspectRatio: 1,
children: List.generate(images.length, (index) {
if (images[index] is ImageUploadModel) {
ImageUploadModel uploadModel = images[index];
return Card(
clipBehavior: Clip.antiAlias,
child: Stack(
children: <Widget>[
Image.file(
uploadModel.imageFile,
width: 300,
height: 300,
),
Positioned(
right: 5,
top: 5,
child: InkWell(
child: Icon(
Icons.remove_circle,
size: 20,
color: Colors.red,
),
onTap: () {
setState(() {
images.replaceRange(index, index + 1, ['Add Image']);
_identificationpictures.add(images);
});
},
),
),
],
),
);
} else {
return Card(
child: IconButton(
icon: Icon(Icons.add),
onPressed: () {
_onAddImageClick(index);
},
),
);
}
}),
);
}
Future _onAddImageClick(int index) async {
setState(() {
_imageFile = ImagePicker.pickImage(source: ImageSource.gallery);
getFileImage(index);
});
}
void getFileImage(int index) async {
// var dir = await path_provider.getTemporaryDirectory();
_imageFile.then((file) async {
setState(() {
ImageUploadModel imageUpload = new ImageUploadModel();
imageUpload.isUploaded = false;
imageUpload.uploading = false;
imageUpload.imageFile = file;
imageUpload.imageUrl = '';
images.replaceRange(index, index + 1, [imageUpload]);
});
});
}
Widget _buildinformationislegitmate() {
return TudoConditionWidget(
text:
"Above entered Identity information is legitimate and accurate to my knowledge",
);
}
@override
Widget build(BuildContext context) {
final appBar = AppBar(
title: Text("BSP Unlicensed Details"),
leading: IconButton(
icon: Icon(Icons.arrow_back_ios),
onPressed: () {
NavigationHelper.navigatetoBack(context);
},
),
actions: <Widget>[
IconButton(
icon: Icon(Icons.add),
onPressed: () {
setState(() {
_add();
});
},
),
],
centerTitle: true,
);
final bottomNavigationBar = Container(
color: Colors.transparent,
height: 56,
//margin: EdgeInsets.symmetric(vertical: 24, horizontal: 12),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
new FlatButton.icon(
icon: Icon(Icons.close),
label: Text('Clear'),
color: Colors.redAccent,
textColor: Colors.black,
padding: EdgeInsets.symmetric(vertical: 10, horizontal: 30),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(7),
),
onPressed: () {},
),
new FlatButton.icon(
icon: Icon(FontAwesomeIcons.arrowCircleRight),
label: Text('Next'),
color: colorStyles["primary"],
padding: EdgeInsets.symmetric(vertical: 10, horizontal: 30),
textColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(7),
),
onPressed: () async {
setState(() {
autovalidate = !autovalidate;
});
if (_formKey.currentState.validate()) {
List<Licensed> listOfLicenses = new List<Licensed>();
BspSignupCommonModel model = widget.bspSignupCommonModel;
for (var i = 0; i < _myWidgets.length; i++) {
String document = _documentControllers[i].text;
String issuingAuthorityType = _issuingauthoritytype[i].text;
String expiryDate = _expiryDate[i].text;
String issuingAuthority = _issuingauthority[i].text;
// String picture = _identificationpictures[i].text;
print('Document: $document');
print('IssuingAuthorityType: $issuingAuthorityType');
print('ExpiryDate: $expiryDate');
print('IssuingAuthority: $issuingAuthority');
print('Picture: ${_identificationpictures.length}');
print(_myWidgets.length);
Licensed licensed = new Licensed(
bspLicenseNumber: document,
bspAuthority: issuingAuthority,
bspExpiryDate: expiryDate,
bspIssuing: issuingAuthorityType,
);
licensed.bspLicenseNumber = _documentControllers[i].text;
licensed.bspExpiryDate = _expiryDate[i].text;
licensed.bspIssuing = _issuingauthoritytype[i].text;
licensed.bspAuthority = _issuingauthority[i].text;
listOfLicenses.add(licensed);
}
model.unlicensed = listOfLicenses;
print(model.toJson());
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => BspLicensedSignupTermsPage(
bspSignupCommonModel: model),
));
}
}),
],
),
);
return new Scaffold(
appBar: appBar,
bottomNavigationBar: bottomNavigationBar,
floatingActionButton: new FloatingActionButton.extended(
onPressed: () {
_add();
},
label: Text(
"Add License",
style: TextStyle(color: Colors.white, fontSize: 16),
),
icon: Icon(
Icons.add,
size: 28,
color: Colors.white,
),
),
body: Container(
height: double.infinity,
width: double.infinity,
child: Form(
autovalidate: autovalidate,
key: _formKey,
child: Stack(
children: <Widget>[
Column(
children: <Widget>[
Expanded(
child: SizedBox(
child: ListView(
padding: const EdgeInsets.all(18.0),
children: _myWidgets,
),
),
),
_buildinformationislegitmate(),
],
)
],
)),
),
);
}
}
类BSPNalizedSignupPage扩展StatefulWidget{
静态常量字符串routeName=“/bspunlessedsignup”;
最终BspSignupCommonModel BspSignupCommonModel;
BSP未经许可的SignupPage({
关键点,
@需要此.bspSignupCommonModel,
}):super(key:key);
@凌驾
_BSUnlicensedSignupPageState createState()=>
_BSPNalizedSignupPageState();
}
类bspuunlicensedSignupPageState扩展状态{
最终的GlobalKey _formKey=GlobalKey();
列表图像=列表();
未来图像文件;
bool autovalidate=false;
bool informationisregimitate=false;
DateTime expireydate1=DateTime.now();
DateTime expireydate2=DateTime.now();
最终格式=日期格式(“yyyy-MM-dd”);
最终格式2=日期格式(“yyyy-MM-dd”);
字符串类型2='Passport';
列表类型=[
'',
“护照”,
“驾驶执照”,
"选民身份证",,
“配给卡”,
“阿达尔”,
“其他Id”,
];
字符串类型='Passport';
//映射_formdata={};
var_myWidgets=List();
int_指数=1;
最终地图标识1VALUES=Map();
最终地图文档值=地图();
最终映射expiryDateValues=Map();
最终地图发布权限=地图();
最终地图标识PicturesValues=地图();
最终列表_documentControllers=List();
最终列表_issuingauthoritytype=List();
最终列表_expiryDate=List();
最终列表_发布权限=列表();
最终列表_identificationpictures=List();
@凌驾
void initState(){
super.initState();
设置状态(){
图像。添加(“添加图像”);
图像。添加(“添加图像”);
图像。添加(“添加图像”);
图像。添加(“添加图像”);
图像。添加(“添加图像”);
});
}
void_add(){
//TextEditingController=TextEditingController();
设置状态(){
int keyValue=_myWidgets.length;
_myWidgets=List.from(_myWidgets)
…添加(第列)(
key:key(“$keyValue”),
儿童:[
尺寸箱(高度:10),
容器(
//填充物:LTRB(18,5,18,18)的边缘设置,
填充:边缘设置。全部(15),
装饰:盒子装饰(
颜色:颜色,白色,
边界半径:边界半径。圆形(10),
boxShadow:[
箱形阴影(
颜色:颜色。黑色,
半径:15,
),
],
),
子:列(
儿童:[
堆叠(
儿童:[
对齐(
对齐:alignment.topRight,
儿童:手势检测器(
子:图标(Icons.close),
onTap:(){
打印(“闭压”);
设置状态(){
_myWidgets=List.from(_myWidgets)
..移除(键值);
});
},
),
),
大小盒子(
身高:10,
),
纵队(
儿童:[
大小盒子(
身高:20,
),
_buildidentificationtype1(keyValue),
_builddocumentnumber1(键值),
_构建日期(keyValue),
_BuildingIssuingAuthority1(键值),
_buildidentificationpictures(keyValue),
],
),
],
)
],
),
)
],
));
});
}
bool isClicked=false;
小部件_buildidentificationtype1(int-keyValue){
TextEditingController=TextEditingController();
_issuingauthoritytype.add(控制器);
返回表单生成器(
自动验证:自动验证,
子项:FormBuilderCustomField(
属性:“业务类型”,
验证器:[FormBuilderValidators.required()],
formField:formField(
生成器:(FormFieldState字段){
返回输入装饰器(
装饰:输入装饰(
前缀图标:图标(图标位置打开),
labelText:“业务类型”,
),
isEmpty:type=='',
子项:新的下拉按钮hideUnderline(
孩子:新的下拉按钮(
值:类型,
是的,
onChanged:(字符串newValue){
设置状态(){
类型=控制器。文本=新值;
字段.didChange(newValue);
});
},
项目:\ u type.map(
(字符串值){
返回新的DropdownMenuItem(
价值:价值,
子项:新文本(值),
);
},
).toList(),
),
),
);
},
)),
);
}
小部件_builddocumentnumber1(int-keyValue){
文本编辑控制