Added Images support in ReqChat

master_new_changes
Faiz Hashmi 1 year ago
parent 56d6bc196b
commit 3bd72ef382

@ -17,6 +17,7 @@ class ChatMessageModel {
int? serviceProviderID;
int? offerStatus;
ReqOffer? reqOffer;
List<MessageImageModel>? messageImages;
bool? isRead;
String? readOn;
bool? isMyMessage;
@ -34,6 +35,7 @@ class ChatMessageModel {
this.serviceProviderID,
this.offerStatus,
this.reqOffer,
this.messageImages,
this.isRead,
this.readOn,
this.isMyMessage,
@ -44,7 +46,7 @@ class ChatMessageModel {
return 'ChatMessageModel{id: $id, senderUserID: $senderUserID, senderName: $senderName, messageType: $messageType, chatMessageTypeEnum: $chatMessageTypeEnum, chatText: $chatText, requestID: $requestID, reqOfferID: $reqOfferID, serviceProviderID: $serviceProviderID, offerStatus: $offerStatus, reqOffer: ${reqOffer.toString()}, isRead: $isRead, readOn: $readOn, isMyMessage: $isMyMessage}';
}
ChatMessageModel.fromJson(Map<String, dynamic> json) {
ChatMessageModel.fromJson(Map<String, dynamic> json, {bool isFromNetwork = true}) {
final myUserId = AppState().getUser.data!.userInfo!.userId.toString().toUpperCase();
id = json['id'];
senderUserID = json['senderUserID'];
@ -58,6 +60,12 @@ class ChatMessageModel {
serviceProviderID = json['serviceProviderID'];
offerStatus = json['offerStatus'];
reqOffer = json['reqOffer'] != null ? ReqOffer.fromJson(json['reqOffer']) : null;
if (json['reqOfferImages'] != null) {
messageImages = <MessageImageModel>[];
json['reqOfferImages'].forEach((v) {
messageImages!.add(MessageImageModel.fromJson(v, isFromNetwork));
});
}
isRead = json['isRead'];
readOn = json['readOn'];
isMyMessage = (json['senderUserID']).toString().toUpperCase() == myUserId;
@ -121,3 +129,38 @@ class OfferRequestCommentModel {
OfferRequestCommentModel({this.index, this.title, this.isSelected});
}
class MessageImageModel {
int? id;
String? imageUrl;
String? imageStr;
String? imagePath;
bool? isFromNetwork;
int? reqOfferID;
MessageImageModel({
this.id,
this.imageUrl,
this.imageStr,
this.imagePath,
this.reqOfferID,
this.isFromNetwork = false,
});
MessageImageModel.fromJson(Map<String, dynamic> json, bool fromNetwork) {
id = json['id'];
imageUrl = json['imageUrl'];
imageStr = json['imageStr'];
imagePath = json[''];
reqOfferID = json['reqOfferID'];
isFromNetwork = fromNetwork;
}
Map<String, dynamic> toJson() {
return {
'id': id,
'imageStr': imageStr,
'reqOfferID': reqOfferID, // We don't include 'isFromNetwork' since it's set manually when parsing JSON
};
}
}

@ -1,6 +1,8 @@
// ignore_for_file: use_build_context_synchronously
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/classes/app_state.dart';
@ -13,8 +15,10 @@ import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/requests_models/provider_offers_model.dart';
import 'package:mc_common_app/repositories/chat_repo.dart';
import 'package:mc_common_app/repositories/request_repo.dart';
import 'package:mc_common_app/services/common_services.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:provider/provider.dart';
import 'package:signalr_core/signalr_core.dart';
@ -23,8 +27,9 @@ import 'package:easy_localization/easy_localization.dart';
class ChatVM extends ChangeNotifier {
final ChatRepo chatRepo;
final RequestRepo requestRepo;
final CommonAppServices commonServices;
ChatVM({required this.chatRepo, required this.requestRepo});
ChatVM({required this.chatRepo, required this.requestRepo, required this.commonServices});
HubConnection? hubConnection;
@ -295,15 +300,62 @@ class ChatVM extends ChangeNotifier {
return true;
}
Future<bool> onTextMessageSendForRequest({
MessageImageModel convertFileToMessageImageModel({required File file}) {
List<int> imageBytes = file.readAsBytesSync();
String image = base64Encode(imageBytes);
MessageImageModel vehiclePostingImages = MessageImageModel(imageStr: image,
id: 0,
isFromNetwork: false,
reqOfferID: latestOfferId,
imagePath: file.path);
return vehiclePostingImages;
}
List<MessageImageModel> getMessagesImageList() {
List<MessageImageModel> requestImages = [];
for (var image in pickedImagesForMessage) {
var value = convertFileToMessageImageModel(file: File(image.filePath!));
requestImages.add(value);
}
return requestImages;
}
List<ImageModel> pickedImagesForMessage = [];
void removeImageFromList(String filePath) {
int index = pickedImagesForMessage.indexWhere((element) => element.filePath == filePath);
if (index == -1) {
return;
}
pickedImagesForMessage.removeAt(index);
notifyListeners();
}
void pickMultipleImages() async {
List<ImageModel> imageModels = [];
List<File> images = await commonServices.pickMultipleImages();
for (var element in images) {
imageModels.add(ImageModel(filePath: element.path, isFromNetwork: false));
}
pickedImagesForMessage.addAll(imageModels);
notifyListeners();
}
void clearPickedImagesForMessage() {
pickedImagesForMessage.clear();
notifyListeners();
}
Future<bool> onMessageSendForRequest({
required String receiverId,
required ChatMessageTypeEnum chatMessageType,
required String message,
required int requestId,
required String offerPrice,
required BuildContext context,
}) async {
if (message.isEmpty) return false;
if (chatMessageType == ChatMessageTypeEnum.freeText && message.isEmpty) return false;
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
logger.i("Hub Not Connected!!");
@ -313,7 +365,13 @@ class ChatVM extends ChangeNotifier {
if (hubConnection!.state == HubConnectionState.connected) {
final userId = AppState().getUser.data!.userInfo!.userId.toString();
final name = AppState().getUser.data!.userInfo!.firstName.toString();
List<Map<String, dynamic>> requestImagesMap = [];
List<MessageImageModel> messageImages = getMessagesImageList();
if (messageImages.isNotEmpty && chatMessageType == ChatMessageTypeEnum.image) {
for (var element in messageImages) {
requestImagesMap.add(element.toJson());
}
}
final obj = <String, dynamic>{
"ReceiverUserID": receiverId,
"SenderUserID": userId,
@ -321,8 +379,11 @@ class ChatVM extends ChangeNotifier {
"ChatText": message,
"RequestID": requestId,
"ReqOfferID": latestOfferId,
// "ReqOffer": {}
};
if (chatMessageType == ChatMessageTypeEnum.image) {
obj.addAll({"ReqOfferImages": requestImagesMap});
}
logger.i(obj);
hubConnection!.invoke(
@ -341,8 +402,9 @@ class ChatVM extends ChangeNotifier {
requestID: requestId,
senderName: name,
senderUserID: userId,
chatMessageTypeEnum: ChatMessageTypeEnum.freeText,
chatMessageTypeEnum: chatMessageType,
receiverUserID: receiverId,
messageImages: messageImages,
);
if (AppState().currentAppType == AppType.customer) {
@ -351,7 +413,10 @@ class ChatVM extends ChangeNotifier {
serviceProviderOffersList[providerIndex].chatMessages!.add(chatMessageModel);
}
} else {
int providerIndex = context.read<RequestsVM>().myFilteredRequests.indexWhere((element) => (element.customerUserID == receiverId && element.id == requestId));
int providerIndex = context
.read<RequestsVM>()
.myFilteredRequests
.indexWhere((element) => (element.customerUserID == receiverId && element.id == requestId));
log("providerIndex2:$providerIndex");
if (providerIndex != -1) {
context.read<RequestsVM>().addChatMessagesInRequestsModel(msg: chatMessageModel, index: providerIndex);
@ -594,8 +659,7 @@ class ChatVM extends ChangeNotifier {
notifyListeners();
if (AppState().currentAppType == AppType.customer) {
} else {}
if (AppState().currentAppType == AppType.customer) {} else {}
return true;
}
return false;

@ -97,13 +97,13 @@ class RequestsVM extends BaseVM {
requestStatusIdApi = requestStatusId.selectedId;
}
log("requestTypeIdApi: $requestTypeIdApi");
log("requestCityIdApi: $requestCityIdApi");
log("requestConditionIdApi: $requestConditionIdApi");
log("requestVehicleBrandApi: $brand");
log("requestVehicleModelApi: $model");
log("requestVehicleYearIdApi: $requestVehicleYearIdApi");
log("requestStatusIdApi: $requestStatusIdApi");
// log("requestTypeIdApi: $requestTypeIdApi");
// log("requestCityIdApi: $requestCityIdApi");
// log("requestConditionIdApi: $requestConditionIdApi");
// log("requestVehicleBrandApi: $brand");
// log("requestVehicleModelApi: $model");
// log("requestVehicleYearIdApi: $requestVehicleYearIdApi");
// log("requestStatusIdApi: $requestStatusIdApi");
// try {
myFilteredRequests = await requestRepo.getRequestsBasedOnFilters(

@ -1,5 +1,8 @@
import 'dart:developer';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
@ -9,9 +12,11 @@ import 'package:mc_common_app/models/chat_models/chat_message_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/chat_view_model.dart';
import 'package:mc_common_app/view_models/payment_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/views/advertisement/components/picked_images_container_widget.dart';
import 'package:mc_common_app/views/chat/widgets/chat_bottom_sheets.dart';
import 'package:mc_common_app/views/chat/widgets/chat_message_widget.dart';
import 'package:mc_common_app/views/requests/request_bottomsheets.dart';
@ -62,16 +67,15 @@ class _ChatViewState extends State<ChatView> {
super.dispose();
}
Future<bool> onTextMessageSend() async {
Future<bool> onMessageSend({required ChatMessageTypeEnum chatMessageType}) async {
bool status = false;
if (chatTypeEnum == ChatTypeEnum.requestOffer) {
status = await chatVM.onTextMessageSendForRequest(
status = await chatVM.onMessageSendForRequest(
context: context,
receiverId: chatViewArgumentsForRequest!.receiverId,
message: chatVM.chatMessageText,
requestId: chatViewArgumentsForRequest!.requestId ?? 0,
offerPrice: "0.0",
chatMessageType: ChatMessageTypeEnum.freeText,
chatMessageType: chatMessageType,
);
} else if (chatTypeEnum == ChatTypeEnum.ads) {
status = await chatVM.onTextMessageSendForAds(
@ -81,8 +85,9 @@ class _ChatViewState extends State<ChatView> {
adId: chatViewArgumentsForAd!.adsID!,
context: context,
);
} else if (chatTypeEnum == ChatTypeEnum.general) {
} else {}
} else if (chatTypeEnum == ChatTypeEnum.general) {}
Utils.hideLoading(context);
return status;
}
@ -161,7 +166,7 @@ class _ChatViewState extends State<ChatView> {
),
),
] else ...[
if (AppState().currentAppType == AppType.provider && chatTypeEnum == ChatTypeEnum.requestOffer && requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.submitted) ...[
if (AppState().currentAppType == AppType.provider && chatTypeEnum == ChatTypeEnum.requestOffer && requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.submitted && chatVM.pickedImagesForMessage.isEmpty) ...[
Expanded(
flex: 1,
child: const Icon(
@ -176,28 +181,53 @@ class _ChatViewState extends State<ChatView> {
),
),
],
Expanded(
flex: 8,
child: TxtField(
value: chatVM.chatMessageText,
hint: LocaleKeys.typeMessageHere.tr(),
keyboardType: TextInputType.text,
isNeedBorder: false,
onChanged: (v) => chatVM.updateChatMessageText(v),
if (chatVM.pickedImagesForMessage.isNotEmpty) ...[
Expanded(
flex: 8,
child: PickedFilesContainer(
pickedFiles: chatVM.pickedImagesForMessage,
onCrossPressedPrimary: chatVM.removeImageFromList,
onAddFilePressed: () => chatVM.pickMultipleImages(),
),
),
),
] else ...[
Expanded(
flex: 1,
child: const Icon(
Icons.photo_library_rounded,
color: MyColors.darkPrimaryColor,
size: 30,
).onPress(() => chatVM.pickMultipleImages()),
),
Expanded(
flex: 8,
child: TxtField(
value: chatVM.chatMessageText,
hint: LocaleKeys.typeMessageHere.tr(),
keyboardType: TextInputType.text,
isNeedBorder: false,
onChanged: (v) => chatVM.updateChatMessageText(v),
),
),
],
Expanded(
flex: 1,
child: const Icon(
Icons.send_rounded,
color: MyColors.darkPrimaryColor,
size: 30,
).onPress(
child: const Icon(Icons.send_rounded, color: MyColors.darkPrimaryColor, size: 30).onPress(
() async {
final status = await onTextMessageSend();
ChatMessageTypeEnum chatMessageTypeEnum = ChatMessageTypeEnum.freeText;
if (chatVM.pickedImagesForMessage.isNotEmpty) {
chatMessageTypeEnum = ChatMessageTypeEnum.image;
}
final status = await onMessageSend(chatMessageType: chatMessageTypeEnum);
if (status) {
chatVM.scrollChatDown();
chatVM.clearChatMessageText();
if (chatMessageTypeEnum == ChatMessageTypeEnum.freeText) {
chatVM.clearChatMessageText();
} else if (chatMessageTypeEnum == ChatMessageTypeEnum.image) {
chatVM.clearPickedImagesForMessage();
}
}
},
),

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
@ -221,7 +223,6 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
);
}
//offerNoLongerAvailable
switch (requestOfferStatusEnum) {
case RequestOfferStatusEnum.offer:
return Column(
@ -405,6 +406,148 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
return widget.toCircle(borderRadius: 100);
}
Widget buildFreeTextDetailsInMessage() {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Directionality(
textDirection: TextDirection.ltr,
child: (widget.chatMessageModel.chatText ?? "").toText(
color: (widget.chatMessageModel.isMyMessage ?? false) ? MyColors.white : MyColors.lightTextColor,
fontSize: 12,
// isBold: true,
),
),
),
],
);
}
Widget buildImageGridWidget(
{required List<MessageImageModel> messagesImages,
double gridItemSize = 50.0, // Default fixed size for each grid item
double spacing = 8.0,
double borderWidth = 1,
Color borderColor = MyColors.textColor}) {
int imageCount = messagesImages.length;
if (imageCount == 1) {
return Container(
width: double.infinity,
height: (gridItemSize * 4),
decoration: BoxDecoration(
border: Border.all(width: borderWidth, color: borderColor),
borderRadius: BorderRadius.circular(8),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: (messagesImages[0].isFromNetwork ?? false)
? messagesImages[0].imageUrl.buildNetworkImage(
fit: BoxFit.cover,
)
: messagesImages[0].imagePath.buildFileImage(fit: BoxFit.cover),
),
);
}
return SizedBox(
// height: (gridItemSize * 2) + (spacing * 2), // Fixed height for 2 rows including spacing
child: GridView.builder(
physics: const NeverScrollableScrollPhysics(),
// Prevent scrolling inside grid
shrinkWrap: true,
// Shrink size to fit the content
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, // Show 2 images per row
crossAxisSpacing: spacing,
mainAxisSpacing: spacing,
childAspectRatio: 1, // Keep items square
),
itemCount: imageCount > 4 ? 4 : imageCount,
itemBuilder: (context, index) {
if (index == 3 && imageCount > 4) {
return Stack(
fit: StackFit.expand,
children: [
(messagesImages[0].isFromNetwork ?? false)
? messagesImages[index].imageUrl.buildNetworkImage(
fit: BoxFit.cover,
width: gridItemSize,
height: gridItemSize,
)
: messagesImages[index].imagePath.buildFileImage(
fit: BoxFit.cover,
width: gridItemSize,
height: gridItemSize,
),
Container(
decoration: BoxDecoration(
color: Colors.black.withOpacity(0.5),
border: Border.all(width: borderWidth, color: borderColor),
borderRadius: BorderRadius.circular(8), // Optional: Rounded corners
),
child: Center(
child: '+${imageCount - 4}'.toText(fontSize: 30, color: MyColors.white, fontWeight: MyFonts.Medium),
),
),
],
);
} else {
return Container(
width: gridItemSize,
height: gridItemSize,
decoration: BoxDecoration(
border: Border.all(width: borderWidth, color: borderColor),
borderRadius: BorderRadius.circular(8), // Optional: Rounded corners
),
child: ClipRRect(
borderRadius: BorderRadius.circular(8), // Apply same radius to image
child: messagesImages[index].imageUrl.buildNetworkImage(
fit: BoxFit.cover,
width: gridItemSize,
height: gridItemSize,
),
),
);
}
},
),
);
}
Widget messageWidgetBasedOnType({required ChatMessageTypeEnum? chatMessageTypeEnum}) {
Widget messageTypeWidget = const SizedBox();
if (chatMessageTypeEnum == null) {
return const SizedBox();
}
switch (chatMessageTypeEnum) {
case ChatMessageTypeEnum.freeText:
messageTypeWidget = Column(children: [buildFreeTextDetailsInMessage(), 10.height]);
break;
case ChatMessageTypeEnum.image:
messageTypeWidget = buildImageGridWidget(messagesImages: widget.chatMessageModel.messageImages ?? []);
break;
case ChatMessageTypeEnum.audio:
case ChatMessageTypeEnum.video:
case ChatMessageTypeEnum.file:
case ChatMessageTypeEnum.offer:
messageTypeWidget = Column(
children: [
buildFreeTextDetailsInMessage(),
10.height,
buildOfferDetailsInChatMessage(requestStatusEnum: widget.requestStatusEnum, chatMessageModel: widget.chatMessageModel, context: context),
],
);
break;
}
return messageTypeWidget.toContainer(
isShadowEnabled: !(widget.chatMessageModel.isMyMessage ?? false),
backgroundColor: (widget.chatMessageModel.isMyMessage ?? false) ? MyColors.darkIconColor : MyColors.white,
borderRadius: 0,
margin: EdgeInsets.fromLTRB((widget.chatMessageModel.isMyMessage ?? false) ? 25 : 0, 0, !(widget.chatMessageModel.isMyMessage ?? false) ? 25 : 0, 0),
);
}
@override
Widget build(BuildContext context) {
return Directionality(
@ -437,34 +580,7 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
],
),
5.height,
Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Directionality(
textDirection: TextDirection.ltr,
child: (widget.chatMessageModel.chatText ?? "").toText(
color: (widget.chatMessageModel.isMyMessage ?? false) ? MyColors.white : MyColors.lightTextColor,
fontSize: 12,
// isBold: true,
),
),
),
],
),
10.height,
if (widget.chatMessageModel.chatMessageTypeEnum == ChatMessageTypeEnum.offer) ...[
buildOfferDetailsInChatMessage(requestStatusEnum: widget.requestStatusEnum, chatMessageModel: widget.chatMessageModel, context: context),
],
],
).toContainer(
isShadowEnabled: !(widget.chatMessageModel.isMyMessage ?? false),
backgroundColor: (widget.chatMessageModel.isMyMessage ?? false) ? MyColors.darkIconColor : MyColors.white,
borderRadius: 0,
margin: EdgeInsets.fromLTRB((widget.chatMessageModel.isMyMessage ?? false) ? 25 : 0, 0, !(widget.chatMessageModel.isMyMessage ?? false) ? 25 : 0, 0),
),
messageWidgetBasedOnType(chatMessageTypeEnum: widget.chatMessageModel.chatMessageTypeEnum),
],
),
)

@ -34,8 +34,9 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
//TODO: ONLY FOR DEVELOPMENT PURPOSE
// String phoneNum = "966504278212", password = "Fa@1234";
// String phoneNum = "966504278213", password = "Fa@1234";
String phoneNum = "", password = "";
String phoneNum = "966504278213", password = "Fa@1234";
// String phoneNum = "", password = "";
String email = "";
String countryCode = "";
Country? _country;
@ -50,23 +51,23 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
scheduleMicrotask(() {
userVM = Provider.of(context, listen: false);
context.read<UserVM>().getAvailBio();
// if (AppState().currentAppType == AppType.provider) {
// phoneNum = "966530896018";
// password = "Amir@1234";
//
// // phoneNum = "966569755630";
// // password = "Amir12345@"; //AAmir Sal
//
// // phoneNum = "966598646795";
// // password = "Zahoor@123";
//
// // User Details
// // phoneNum = "966554870506";
// // password = "Sikander123@"; // "lastName": "sik",
// // "email": "sikander@gmail.com",
// // phoneNum = "966569755630";
// // password = "Amir12345@";
// }
if (AppState().currentAppType == AppType.provider) {
phoneNum = "966530896018";
password = "Amir@1234";
//
// // phoneNum = "966569755630";
// // password = "Amir12345@"; //AAmir Sal
//
// // phoneNum = "966598646795";
// // password = "Zahoor@123";
//
// // User Details
// // phoneNum = "966554870506";
// // password = "Sikander123@"; // "lastName": "sik",
// // "email": "sikander@gmail.com",
// // phoneNum = "966569755630";
// // password = "Amir12345@";
}
getCountryList();
});

@ -5,6 +5,7 @@ import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:provider/provider.dart';
import 'dart:io';
extension ExtendedText on Widget {
showOverlay({double? width, double? height}) {
@ -233,8 +234,7 @@ extension WidgetExt on Widget {
);
}
Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) =>
Padding(padding: EdgeInsets.only(left: left, right: right, top: top, bottom: bottom), child: this);
Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) => Padding(padding: EdgeInsets.only(left: left, right: right, top: top, bottom: bottom), child: this);
// Widget onTap(VoidCallback onTap, {double corners = 0}) {
// return Clickable.widget(child: this, corners: corners, onTap: onTap);
@ -336,6 +336,24 @@ extension xDouble on int {
}
extension BuildSVG on String? {
Widget buildFileImage({double? height, double? width, BoxFit fit = BoxFit.contain, Color? color}) {
logger.i("!File(this!).existsSync(): ${!File(this!).existsSync()}");
if (this == null || this!.isEmpty || !File(this!).existsSync()) {
return SizedBox(
height: height,
width: width,
child: SvgPicture.asset(MyAssets.providersIcon, color: MyColors.darkPrimaryColor).paddingAll(15),
);
}
return Image.file(
File(this!),
fit: fit,
color: color,
height: height,
width: width,
);
}
Widget buildSvg({double? height, double? width, BoxFit fit = BoxFit.contain, Color? color}) {
return SvgPicture.asset(
this!,
@ -385,13 +403,7 @@ extension BuildSVG on String? {
extension LocaleSetup on MultiProvider {
Widget setupLocale() {
return EasyLocalization(
supportedLocales: MyLocales.supportedLocales,
fallbackLocale: MyLocales.fallBackLocale,
startLocale: MyLocales.startLocale,
assetLoader: MyLocales.assetLoader,
path: MyLocales.localesAssetPath,
child: this);
return EasyLocalization(supportedLocales: MyLocales.supportedLocales, fallbackLocale: MyLocales.fallBackLocale, startLocale: MyLocales.startLocale, assetLoader: MyLocales.assetLoader, path: MyLocales.localesAssetPath, child: this);
}
}

Loading…
Cancel
Save