attachment as listview added.

design_3.0_medical_gas_inspection
Sikander Saleem 1 month ago
parent a9362d90f5
commit 4763132302

@ -134,6 +134,7 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
attachment: attachments,
buttonColor: AppColor.black10,
onlyImages: false,
showAsListView: true,
buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120),
onChange: (attachments) {
attachments = attachments;

@ -320,6 +320,7 @@ class AttachmentPicker extends StatefulWidget {
Color? buttonColor;
final Function(List<GenericAttachmentModel>)? onChange;
final bool showAsGrid;
final bool showAsListView;
AttachmentPicker(
{Key? key,
@ -332,6 +333,7 @@ class AttachmentPicker extends StatefulWidget {
this.onlyImages = false,
this.onChange,
this.showAsGrid = false,
this.showAsListView = false,
this.buttonColor})
: super(key: key);
@ -357,29 +359,53 @@ class _AttachmentPickerState extends State<AttachmentPicker> {
: onFilePicker),
16.height,
if (widget.attachment.isNotEmpty)
Wrap(
spacing: 8.toScreenWidth,
children: List.generate(
widget.attachment.length,
(index) {
File image = File(widget.attachment[index].name!);
return MultiFilesPickerItem(
file: image,
enabled: widget.enabled,
onRemoveTap: (image) {
if (!widget.enabled) {
return;
}
widget.attachment.removeAt(index);
if (widget.onChange != null) {
widget.onChange!(widget.attachment);
}
setState(() {});
widget.showAsListView
? ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (cxt, index) {
File image = File(widget.attachment[index].name!);
return MultiFilesPickerItem(
file: image,
showAsListView: widget.showAsListView,
enabled: widget.enabled,
onRemoveTap: (image) {
if (!widget.enabled) {
return;
}
widget.attachment.removeAt(index);
if (widget.onChange != null) {
widget.onChange!(widget.attachment);
}
setState(() {});
},
);
},
);
},
),
),
separatorBuilder: (cxt, index) => 8.height,
itemCount: widget.attachment.length)
: Wrap(
spacing: 8.toScreenWidth,
children: List.generate(
widget.attachment.length,
(index) {
File image = File(widget.attachment[index].name!);
return MultiFilesPickerItem(
file: image,
enabled: widget.enabled,
onRemoveTap: (image) {
if (!widget.enabled) {
return;
}
widget.attachment.removeAt(index);
if (widget.onChange != null) {
widget.onChange!(widget.attachment);
}
setState(() {});
},
);
},
),
),
],
);
}
@ -402,11 +428,6 @@ class _AttachmentPickerState extends State<AttachmentPicker> {
}
void showFileSourceSheet() async {
// if (widget.attachment.length >= 5) {
// Fluttertoast.showToast(msg: context.translation.maxImagesNumberIs5);
// return;
// }
ImageSource source = (await showModalBottomSheet(
context: context,
shape: const RoundedRectangleBorder(
@ -475,11 +496,6 @@ class _AttachmentPickerState extends State<AttachmentPicker> {
}
onFilePicker() async {
//TODO removed on request by Backend as they don't have anyissue with large number of files
// if (widget.attachment.length >= 5) {
// Fluttertoast.showToast(msg: context.translation.maxImagesNumberIs5);
// return;
// }
ImageSource? source = await showModalBottomSheet<ImageSource>(
context: context,
builder: (BuildContext context) {

@ -1,5 +1,6 @@
import 'dart:io';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:open_file/open_file.dart';
@ -18,8 +19,16 @@ class MultiFilesPickerItem extends StatelessWidget {
final bool enabled;
final Function(File) onRemoveTap;
final VoidCallback? onRemove;
final bool showAsListView;
const MultiFilesPickerItem({Key? key, required this.file, required this.enabled, required this.onRemoveTap, this.onRemove}) : super(key: key);
const MultiFilesPickerItem({
Key? key,
required this.file,
required this.enabled,
required this.onRemoveTap,
this.onRemove,
this.showAsListView = false,
}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -27,6 +36,97 @@ class MultiFilesPickerItem extends StatelessWidget {
bool isPdf = file.path.split(".").last.toLowerCase() == "pdf";
bool isExcel = file.path.split(".").last.toLowerCase() == "xlsx";
if (showAsListView) {
return Row(
children: [
Container(
width: 48.toScreenWidth,
height: 48.toScreenWidth,
decoration: BoxDecoration(
color: AppColor.neutral90,
border: Border.all(width: 1, color: context.isDark ? AppColor.neutral30 : AppColor.neutral30),
image: DecorationImage(
image: getImage(isImage, isPdf, isExcel, file),
fit: BoxFit.cover,
),
borderRadius: BorderRadius.circular(8),
),
),
8.width,
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Flexible(
child: Text(
file.path.split("/").last,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: AppTextStyles.heading6.copyWith(color: AppColor.black10),
),
),
8.width,
if (enabled)
InkWell(
child: "remove".toSvgAsset(width: 16),
onTap: () {
onRemoveTap(file);
if (onRemove != null) {
onRemove!();
}
},
)
],
),
4.height,
RichText(
text: TextSpan(
text: 'Asset Guide | ',
style: AppTextStyles.bodyText.copyWith(color: AppColor.neutral120),
children: <TextSpan>[
TextSpan(
text: 'View',
recognizer: TapGestureRecognizer()
..onTap = () async {
if (isImage) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => Scaffold(
appBar: const DefaultAppBar(),
body: SafeArea(
child: InteractiveViewer(
child: _isLocalUrl(file.path)
? Image.file(file)
: ImageLoader(
url: URLs.getFileUrl(file.path),
boxFit: BoxFit.cover,
),
).center,
),
),
),
);
} else if (_isLocalUrl(file.path)) {
OpenFile.open(file.path);
} else {
if (!await launchUrl(Uri.parse(URLs.getFileUrl(file.path)!), mode: LaunchMode.externalApplication)) {
Fluttertoast.showToast(msg: "UnExpected Error with file.");
throw Exception('Could not launch');
}
}
},
style: AppTextStyles.bodyText.copyWith(color: AppColor.primary10, decoration: TextDecoration.underline),
),
],
),
),
],
).expanded
],
);
}
return SizedBox(
width: 60.toScreenWidth,
height: 60.toScreenWidth,

Loading…
Cancel
Save