model change

sikander_work
Sikander Saleem 4 years ago
parent 9e5c623184
commit 57f619daff

@ -0,0 +1,156 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:car_provider_app/exceptions/api_exception.dart';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart';
import 'package:http/io_client.dart';
typedef FactoryConstructor<U> = U Function(dynamic);
class APIError {
int errorCode;
String errorMessage;
APIError(this.errorCode, this.errorMessage);
Map<String, dynamic> toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage};
@override
String toString() {
return jsonEncode(this);
}
}
APIException _throwAPIException(Response response) {
switch (response.statusCode) {
case 400:
APIError? apiError;
if (response.body != null && response.body.isNotEmpty) {
var jsonError = jsonDecode(response.body);
apiError = APIError(jsonError['errorCode'], jsonError['errorMessage']);
}
return APIException(APIException.BAD_REQUEST, error: apiError);
case 401:
return APIException(APIException.UNAUTHORIZED);
case 403:
return APIException(APIException.FORBIDDEN);
case 404:
return APIException(APIException.NOT_FOUND);
case 500:
return APIException(APIException.INTERNAL_SERVER_ERROR);
case 444:
var downloadUrl = response.headers["location"];
return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl);
default:
return APIException(APIException.OTHER);
}
}
class ApiClient {
static final ApiClient _instance = ApiClient._internal();
ApiClient._internal();
factory ApiClient() => _instance;
Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
var _headers = {'Accept': 'application/json'};
if (headers != null && headers.isNotEmpty) {
_headers.addAll(headers);
}
if (!kReleaseMode) {
print("Url:$url");
print("body:$jsonObject");
}
var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes);
try {
var jsonData = jsonDecode(response.body);
return factoryConstructor(jsonData);
} catch (ex) {
print(ex);
throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex);
}
}
Future<Response> postJsonForResponse<T>(String url, T jsonObject, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
String? requestBody;
if (jsonObject != null) {
requestBody = jsonEncode(jsonObject);
if (headers == null) {
headers = {'Content-Type': 'application/json'};
} else {
headers['Content-Type'] = 'application/json';
}
}
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes);
}
Future<Response> _postForResponse(String url, requestBody, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
try {
var _headers = <String, String>{};
if (token != null) {
_headers['Authorization'] = 'Bearer $token';
}
if (headers != null && headers.isNotEmpty) {
_headers.addAll(headers);
}
if (queryParameters != null) {
var queryString = new Uri(queryParameters: queryParameters).query;
url = url + '?' + queryString;
}
var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 60));
if (response.statusCode >= 200 && response.statusCode < 300) {
return response;
} else {
throw _throwAPIException(response);
}
} on SocketException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
} on HttpException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
} on TimeoutException catch (e) {
throw APIException(APIException.TIMEOUT, arguments: e);
} on ClientException catch (e) {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
}
}
bool _certificateCheck(X509Certificate cert, String host, int port) => true;
Future<T> _withClient<T>(Future<T> Function(Client) fn) async {
var httpClient = HttpClient()..badCertificateCallback = _certificateCheck;
var client = IOClient(httpClient);
try {
return await fn(client);
} finally {
client.close();
}
}
Future<Response> _post(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding));
}

@ -0,0 +1,27 @@
class LoginApiClient {
static final LoginApiClient _instance = LoginApiClient._internal();
LoginApiClient._internal();
factory LoginApiClient() => _instance;
// Future<CheckMobileAppVersionModel> checkMobileAppVersion() async {
// String url = "${ApiConsts.utilitiesRest}CheckMobileAppVersion";
// Map<String, dynamic> postParams = {};
// postParams.addAll(AppState().postParamsJson);
// return await ApiClient().postJsonForObject((json) => CheckMobileAppVersionModel.fromJson(json), url, postParams);
// }
//
// Future<MemberLoginListModel?> memberLogin(String username, String password) async {
// String url = "${ApiConsts.erpRest}MemberLogin";
// Map<String, dynamic> postParams = {"P_APP_VERSION": "CS", "P_LANGUAGE": "US", "P_PASSWORD": password, "P_USER_NAME": username};
// postParams.addAll(AppState().postParamsJson);
// return await ApiClient().postJsonForObject((json) {
// GenericResponseModel responseData = GenericResponseModel.fromJson(json);
// AppState().postParamsObject?.setLogInTokenID = responseData.logInTokenID;
// return responseData.memberLoginList;
// }, url, postParams);
// }
}

@ -0,0 +1,26 @@
class TangheemUserApiClient {
static final TangheemUserApiClient _instance = TangheemUserApiClient._internal();
TangheemUserApiClient._internal();
factory TangheemUserApiClient() => _instance;
// Future<SurahModel> getSurahs() async {
// String url = "${ApiConsts.tangheemUsers}AlSuar_Get";
// var postParams = {};
// return await ApiClient().postJsonForObject((json) => SurahModel.fromJson(json), url, postParams);
// }
//
// Future<MemberModel> getMembers() async {
// String url = "${ApiConsts.tangheemUsers}Committee_Get";
// var postParams = {};
// return await ApiClient().postJsonForObject((json) => MemberModel.fromJson(json), url, postParams);
// }
//
// Future<ContentInfoModel> getContentInfo(int contentId) async {
// String url = "${ApiConsts.tangheemUsers}ContentInfo_Get";
// var postParams = {"contentTypeId": contentId};
// return await ApiClient().postJsonForObject((json) => ContentInfoModel.fromJson(json), url, postParams);
// }
}

@ -1,34 +0,0 @@
//class which loads components "in the background", i.e. ui does not depend on it
import 'package:car_provider_app/services/shared_preferences.dart';
import 'package:injector/injector.dart';
//import 'package:revocheckapp/services/firebase_service.dart';
class BackgroundLoader {
Future loadBackgroundData() async {
//init notification setting
try {
/*
final isPromotionNotificationEnabled = await Injector.appInstance
.getDependency<ISharedPreferences>()
.promotionNotificationsEnabled;
if (isPromotionNotificationEnabled == null) {
await Injector.appInstance
.getDependency<ISharedPreferences>()
.setPromotionNotificationEnabled(true);
Injector.appInstance
.getDependency<IFirebaseService>()
.subscribeForPromotions();
} */
} catch (_) {
//something wend wrong, set it to true
await Injector.appInstance
.getDependency<ISharedPreferences>()
.setPromotionNotificationEnabled(true);
/*Injector.appInstance
.getDependency<IFirebaseService>()
.subscribeForPromotions();*/
}
}
}

@ -1,38 +0,0 @@
// import 'package:firebase_crashlytics/firebase_crashlytics.dart';
// import 'package:flutter/material.dart';
import 'package:car_provider_app/repo/account_repository.dart';
import 'package:injector/injector.dart';
import 'background_loader.dart';
class AppDependencies {
static void addDependencies() {
Injector injector = Injector.appInstance;
//add dependencies as needed
injector.registerSingleton<IAcRepository>(() => AcRepository());
// injector.registerSingleton<IAcRepository>((injector) => AcRepository());
_addCrashlytics();
_loadBackgroundTasksNonBlocking();
}
static void _addCrashlytics() {
// Set `enableInDevMode` to true to see reports while in debug mode
// This is only to be used for confirming that reports are being
// submitted as expected. It is not intended to be used for everyday
// development.
//Crashlytics.instance.enableInDevMode = true;
// Pass all uncaught errors from the framework to Crashlytics.
// FlutterError.onError = Crashlytics.instance.recordFlutterError;
}
static void _loadBackgroundTasksNonBlocking() {
final backgroundLoader = BackgroundLoader();
backgroundLoader.loadBackgroundData();
}
}

@ -0,0 +1,29 @@
import 'dart:convert';
import 'package:car_provider_app/api/api_client.dart';
class APIException implements Exception {
static const String BAD_REQUEST = 'api_common_bad_request';
static const String UNAUTHORIZED = 'api_common_unauthorized';
static const String FORBIDDEN = 'api_common_forbidden';
static const String NOT_FOUND = 'api_common_not_found';
static const String INTERNAL_SERVER_ERROR = 'api_common_internal_server_error';
static const String UPGRADE_REQUIRED = 'api_common_upgrade_required';
static const String BAD_RESPONSE_FORMAT = 'api_common_bad_response_format';
static const String OTHER = 'api_common_http_error';
static const String TIMEOUT = 'api_common_http_timeout';
static const String UNKNOWN = 'unexpected_error';
final String message;
final APIError? error;
final arguments;
const APIException(this.message, {this.arguments, this.error});
Map<String, dynamic> toJson() => {'message': message, 'error': error, 'arguments': '$arguments'};
@override
String toString() {
return jsonEncode(this);
}
}

@ -1,11 +1,9 @@
import 'package:car_provider_app/config/app_provider.dart';
import 'package:car_provider_app/config/dependencies.dart';
import 'package:car_provider_app/theme/app_theme.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:sizer/sizer.dart';
import 'config/localization.dart';
import 'config/routes.dart';
Future<void> main() async {
@ -25,9 +23,7 @@ Future<void> main() async {
class MyApp extends StatelessWidget {
// This widget is the root of your application.
MyApp() {
AppDependencies.addDependencies();
}
MyApp() {}
@override
Widget build(BuildContext context) {

@ -1,8 +1,8 @@
import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/navigator.dart';
import 'package:car_provider_app/widgets/app_bar.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/widgets/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:flutter/material.dart';
class DashboardPage extends StatelessWidget {
@ -15,10 +15,7 @@ class DashboardPage extends StatelessWidget {
drawer: showDrawer(context),
body: Container(
child: Center(
child: Txt(
"Dashboard/Main Page",
txtType: TxtType.heading3,
),
child: "Dashboard/Main Page".toText22(),
),
),
);
@ -50,13 +47,8 @@ class DashboardPage extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Txt(
"User Name",
txtType: TxtType.heading3,
),
Txt(
"User role or title",
),
"User Name".toText16(),
"User role or title".toText14(),
],
),
),
@ -69,19 +61,19 @@ class DashboardPage extends StatelessWidget {
),
ListTile(
leading: Icon(Icons.notifications),
title: Txt("Notifications"),
title: "Notifications".toText14(),
),
ListTile(
leading: Icon(Icons.settings),
title: Txt("General"),
title: "General".toText14(),
),
ListTile(
leading: Icon(Icons.person),
title: Txt("Account"),
title: "Account".toText14(),
),
ListTile(
leading: Icon(Icons.logout),
title: Txt("Sign Out"),
title: "Sign Out".toText14(),
onTap: () {
pop(context);
pop(context);

@ -1,7 +1,7 @@
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/app_bar.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/widgets/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart';
@ -18,40 +18,34 @@ class CompleteProfilePage extends StatelessWidget {
padding: EdgeInsets.all(40),
child: Column(
children: [
Txt(
"Complete Profile",
txtType: TxtType.heading3,
),
mHeight(12),
"Complete Profile".toText16(),
12.height,
TxtField(
hint: "First Name",
),
mHeight(12),
12.height,
TxtField(
hint: "Surname",
),
mHeight(12),
12.height,
TxtField(
hint: "Email",
),
mHeight(12),
12.height,
TxtField(
hint: "Create Password",
),
mHeight(12),
12.height,
TxtField(
hint: "Confirm Password",
),
mHeight(12),
12.height,
TxtField(
hint: "Phone Number",
),
mHeight(50),
Txt(
"By creating an account you agree to our Terms of Service and Privacy Policy",
textAlign: TextAlign.center,
),
mHeight(16),
50.height,
"By creating an account you agree to our Terms of Service and Privacy Policy".toText14(),
16.height,
ShowFillButton(
title: "Continue",
width: double.infinity,

@ -1,9 +1,9 @@
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/app_bar.dart';
import 'package:car_provider_app/widgets/dialog/dialogs.dart';
import 'package:car_provider_app/widgets/dialog/message_dialog.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/widgets/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart';
@ -18,18 +18,15 @@ class ForgetPasswordPage extends StatelessWidget {
padding: EdgeInsets.all(40),
child: Column(
children: [
Txt(
"Retrieve Password",
txtType: TxtType.heading3,
),
mHeight(12),
"Retrieve Password".toText16(),
12.height,
TxtField(
hint: "Phone Number",
),
TxtField(
hint: "Email",
),
mHeight(40),
40.height,
ShowFillButton(
title: "Continue",
width: double.infinity,

@ -6,8 +6,8 @@ import 'package:car_provider_app/widgets/app_bar.dart';
import 'package:car_provider_app/widgets/button/show_image_button.dart';
import 'package:car_provider_app/widgets/dialog/dialogs.dart';
import 'package:car_provider_app/widgets/dialog/message_dialog.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:flutter/material.dart';
class LoginVerificationPage extends StatelessWidget {
@ -21,10 +21,7 @@ class LoginVerificationPage extends StatelessWidget {
padding: EdgeInsets.all(40),
child: Column(
children: [
Txt(
"Verify Account",
txtType: TxtType.heading3,
),
"Verify Account".toText16(),
mFlex(2),
Row(
children: [
@ -46,7 +43,7 @@ class LoginVerificationPage extends StatelessWidget {
icon: icons + "ic_fingerprint.png",
),
),
mWidth(20),
20.height,
Expanded(
child: ShowImageButton(
onClick: () {
@ -58,7 +55,7 @@ class LoginVerificationPage extends StatelessWidget {
),
],
),
mHeight(40),
40.height,
Row(
children: [
Expanded(
@ -70,7 +67,7 @@ class LoginVerificationPage extends StatelessWidget {
icon: icons + "ic_sms.png",
),
),
mWidth(20),
20.height,
Expanded(
child: ShowImageButton(
onClick: () {

@ -7,7 +7,8 @@ import 'package:car_provider_app/widgets/button/show_image_button.dart';
import 'package:car_provider_app/widgets/dialog/dialogs.dart';
import 'package:car_provider_app/widgets/dialog/message_dialog.dart';
import 'package:car_provider_app/widgets/dialog/otp_dialog.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart';
@ -22,10 +23,7 @@ class LoginVerifyAccountPage extends StatelessWidget {
padding: EdgeInsets.all(40),
child: Column(
children: [
Txt(
"Verify Account",
txtType: TxtType.heading3,
),
"Verify Account".toText16(),
mFlex(1),
TxtField(
hint: "Enter Phone number to verify",
@ -40,7 +38,7 @@ class LoginVerifyAccountPage extends StatelessWidget {
onClick: () {
pop(context);
delay(300).then(
(value) => showMDialog(
(value) => showMDialog(
context,
child: MessageDialog(
title: "Phone Number Verified",
@ -57,7 +55,7 @@ class LoginVerifyAccountPage extends StatelessWidget {
icon: icons + "ic_sms.png",
),
),
mWidth(20),
20.height,
Expanded(
child: ShowImageButton(
onClick: () {
@ -70,7 +68,7 @@ class LoginVerifyAccountPage extends StatelessWidget {
child: MessageDialog(
title: "Phone Number Verified",
onClick: () {
navigateWithName(context, AppRoutes.profile1);
navigateWithName(context, AppRoutes.profile1);
},
),
),

@ -1,9 +1,9 @@
import 'package:car_provider_app/config/routes.dart';
import 'package:car_provider_app/utils/navigator.dart';
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/app_bar.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/widgets/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart';
@ -20,47 +20,39 @@ class Profile1Page extends StatelessWidget {
padding: EdgeInsets.all(40),
child: Column(
children: [
Txt(
"Complete Profile 1/3",
txtType: TxtType.heading3,
),
Txt(
"User Information",
),
mHeight(12),
"Complete Profile 1/3".toText16(),
"User Information".toText14(),
12.height,
TxtField(
hint: "Provider",
),
mHeight(12),
12.height,
TxtField(
hint: "First Name",
),
mHeight(12),
12.height,
TxtField(
hint: "Surname",
),
mHeight(12),
12.height,
TxtField(
hint: "Email",
),
mHeight(12),
12.height,
TxtField(
hint: "Create Password",
),
mHeight(12),
12.height,
TxtField(
hint: "Confirm Password",
),
mHeight(12),
12.height,
TxtField(
hint: "Phone Number",
),
mHeight(50),
Txt(
"By creating an account you agree to our Terms of Service and Privacy Policy",
textAlign: TextAlign.center,
),
mHeight(16),
50.height,
"By creating an account you agree to our Terms of Service and Privacy Policy".toText14(),
16.height,
ShowFillButton(
title: "Continue",
width: double.infinity,

@ -2,8 +2,9 @@ import 'package:car_provider_app/config/routes.dart';
import 'package:car_provider_app/utils/navigator.dart';
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/app_bar.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/widgets/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart';
@ -20,33 +21,28 @@ class Profile2Page extends StatelessWidget {
padding: EdgeInsets.all(40),
child: Column(
children: [
Txt(
"Complete Profile 2/3",
txtType: TxtType.heading3,
),
Txt(
"licenses & certificatoins",
),
mHeight(12),
"Complete Profile 2/3".toText16(),
"licenses & certificatoins".toText14(),
12.height,
TxtField(
hint: "Commercial Record N.O",
// isButtonEnable: true,
isNeedFilterButton: true,
postfixData: Icons.attach_file,
),
mHeight(12),
12.height,
TxtField(
hint: "Chamber of Commerce N.O",
isNeedFilterButton: true,
postfixData: Icons.attach_file,
),
mHeight(12),
12.height,
TxtField(
hint: "VET Certificate N.O",
isNeedFilterButton: true,
postfixData: Icons.attach_file,
),
mHeight(30),
30.height,
ShowFillButton(
title: "Save",
width: double.infinity,

@ -1,10 +1,10 @@
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/app_bar.dart';
import 'package:car_provider_app/widgets/dialog/dialogs.dart';
import 'package:car_provider_app/widgets/dialog/message_dialog.dart';
import 'package:car_provider_app/widgets/dropdown/dropdow_field.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/widgets/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart';
@ -22,31 +22,26 @@ class Profile3Page extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Txt(
"Complete Profile 3/3",
txtType: TxtType.heading3,
),
Txt(
"Branch Info and Services",
),
mHeight(12),
"Complete Profile 3/3".toText16(),
"Branch Info and Services".toText14(),
12.height,
DropdownField(
hint: "Country",
),
mHeight(12),
12.height,
DropdownField(
hint: "City",
),
mHeight(12),
12.height,
TxtField(
hint: "Address",
maxLines: 5,
),
mHeight(12),
Txt("Select Location Map"),
mHeight(12),
12.height,
"Select Location Map".toText14(),
12.height,
Image.asset("assets/images/bn_map.png"),
mHeight(50),
50.height,
ShowFillButton(
title: "Save",
width: double.infinity,

@ -1,7 +1,7 @@
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/app_bar.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/widgets/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/txt_field.dart';
import 'package:flutter/material.dart';
@ -16,27 +16,21 @@ class RegisterPage extends StatelessWidget {
padding: EdgeInsets.all(40),
child: Column(
children: [
Txt(
"Enter Phone Number",
txtType: TxtType.heading3,
),
mHeight(12),
"Enter Phone Number".toText16(),
12.height,
TxtField(
hint: "Enter Phone number to Register",
),
TxtField(
hint: "Enter Phone number to Register",
),
mHeight(40),
Txt(
"Or Enter Email",
txtType: TxtType.heading3,
),
mHeight(12),
40.height,
"Or Enter Email".toText16(),
12.height,
TxtField(
hint: "Enter Email to Register",
),
mHeight(50),
50.height,
ShowFillButton(
title: "Continue",
width: double.infinity,

@ -2,8 +2,9 @@ import 'package:car_provider_app/config/routes.dart';
import 'package:car_provider_app/utils/navigator.dart';
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/app_bar.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/widgets/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:flutter/material.dart';
class RegisterSelectionPage extends StatelessWidget {
@ -17,10 +18,7 @@ class RegisterSelectionPage extends StatelessWidget {
padding: EdgeInsets.all(40),
child: Column(
children: [
Txt(
"Welcome Message",
txtType: TxtType.heading3,
),
"Welcome Message".toText16(),
mFlex(1),
ShowFillButton(
title: "Log In",
@ -29,7 +27,7 @@ class RegisterSelectionPage extends StatelessWidget {
navigateWithName(context, AppRoutes.loginVerifyAccount);
},
),
mHeight(20),
20.height,
ShowFillButton(
title: "Sign Up",
width: double.infinity,
@ -37,7 +35,7 @@ class RegisterSelectionPage extends StatelessWidget {
navigateWithName(context, AppRoutes.register);
},
),
mHeight(20),
20.height,
ShowFillButton(
title: "Forget Password",
width: double.infinity,

@ -1,9 +1,8 @@
import 'dart:async';
import 'package:car_provider_app/config/routes.dart';
import 'package:car_provider_app/utils/navigator.dart';
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/widgets/extensions/widget_extensions.dart';
import 'package:flutter/material.dart';
class SplashPage extends StatelessWidget {
@ -16,29 +15,15 @@ class SplashPage extends StatelessWidget {
child: Column(
children: [
mFlex(5),
Txt(
"Logo",
fontSize: 45,
bold: true,
),
"Logo".toText32(isBold: true),
mFlex(3),
Txt(
"First Time Log In",
txtType: TxtType.heading1,
isFlatButton: true,
onTap: () {
navigateWithName(context, AppRoutes.registerSelection);
},
),
"First Time Log In".toText24().onPress(() {
navigateWithName(context, AppRoutes.registerSelection);
}),
mFlex(1),
Txt(
"Already Signed Up and Logged In",
txtType: TxtType.heading1,
isFlatButton: true,
onTap: () {
navigateWithName(context, AppRoutes.loginVerification);
},
),
"Already Signed Up and Logged In".toText24().onPress(() {
navigateWithName(context, AppRoutes.loginVerification);
}),
mFlex(5),
],
),

@ -1,49 +0,0 @@
import 'dart:convert';
import 'dart:io';
import 'package:car_provider_app/models/account.dart';
import 'package:car_provider_app/models/response_models.dart';
import 'package:car_provider_app/services/backend_service.dart';
import 'package:injector/injector.dart';
abstract class IAcRepository {
Future<Account> getAccountList();
Future<BackendResponse> updateAccount(String dataAsJson);
}
class AcRepository implements IAcRepository {
static const String ACCOUNT_API_CONTROLLER_MOBILE =
"AccountApiControllerMobile/";
static const String ACCOUNT_LIST = ACCOUNT_API_CONTROLLER_MOBILE + "list";
static const String UPDATE_LIST =
ACCOUNT_API_CONTROLLER_MOBILE + "saveaccountselected";
@override
Future<Account> getAccountList() async {
BackendResponse response = await Injector.appInstance
.getDependency<IBackendApiService>()
.getAuthenticatedAPI(ACCOUNT_LIST);
if (response != null && response.isOk) {
return Account.fromJson(response.result);
} else {
throw Exception();
}
}
@override
Future<BackendResponse> updateAccount(String dataAsJson) async {
BackendResponse response = await Injector.appInstance
.getDependency<IBackendApiService>()
.postAuthenticatedAPI(UPDATE_LIST, dataAsJson);
if (response != null && response.isOk) {
//if parsing failed, throw exception
return response;
} else {
throw Exception();
}
}
}

@ -1,14 +1,13 @@
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'dart:ui';
import 'package:car_provider_app/config/constants.dart';
import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:sizer/sizer.dart';
Color getColorFromHex(String hexColor) {
@ -27,6 +26,7 @@ Widget spacerVertical(double v) {
width: double.infinity,
);
}
Future delay(int millis) async {
return await Future.delayed(Duration(milliseconds: millis));
}
@ -44,13 +44,6 @@ Widget spacerHorizontal(double v) {
);
}
Widget mHeight(double f) {
return Container(
width: f,
height: f,
);
}
Widget mDivider(Color color, {double? h}) {
return Container(
width: double.infinity,
@ -89,13 +82,6 @@ InputDecoration txtField(String label) {
);
}
Widget mWidth(double f) {
return Container(
width: f,
height: f,
);
}
Widget mFlex(int f) {
return Flexible(
flex: f,
@ -105,6 +91,7 @@ Widget mFlex(int f) {
),
);
}
Widget mExp(int f) {
return Expanded(
flex: f,
@ -147,14 +134,8 @@ Widget floatButton(String icon, {Color? color, required Function onClick, String
margin: EdgeInsets.all(1),
),
),
if (title != null) mHeight(2.w),
if (title != null)
Txt(
title,
fontSize: 12.sp,
bold: true,
color: headingColor,
)
if (title != null) 2.w.toInt().height,
if (title != null) title.toText12(color: headingColor, isBold: true),
],
),
);
@ -198,17 +179,19 @@ String base64String(Uint8List data) {
return base64Encode(data);
}
Widget overLayWidget({double? width, double? height,List<Color>? color}) {
Widget overLayWidget({double? width, double? height, List<Color>? color}) {
return Container(
width: width ?? double.infinity,
height: height ?? 60,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: color!=null?color:[
Colors.black.withOpacity(0.2),
Colors.black.withOpacity(0.1),
Colors.black.withOpacity(0.004),
],
colors: color != null
? color
: [
Colors.black.withOpacity(0.2),
Colors.black.withOpacity(0.1),
Colors.black.withOpacity(0.004),
],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
tileMode: TileMode.clamp,
@ -287,11 +270,6 @@ Decoration containerColorRadiusBorder(Color background, double radius, Color col
);
}
//Decoration appGradient = BoxDecoration(
// gradient: LinearGradient(
// colors: [

@ -1,7 +1,6 @@
import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:flutter/material.dart';
import 'package:sizer/sizer.dart';
AppBar appBar({
Color? backgroundColor,
@ -20,9 +19,6 @@ AppBar appBar({
color: backIconColor ?? Colors.black, //change your color here
),
actions: actions,
title: Txt(
title ?? "",
txtType: TxtType.appBar,
),
title: (title ?? "").toText16(),
);
}

@ -1,15 +1,13 @@
import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:flutter/material.dart';
import '../txt.dart';
class ShowImageButton extends StatelessWidget {
String icon, title;
VoidCallback onClick;
ShowImageButton(
{required this.icon, required this.title, required this.onClick});
ShowImageButton({required this.icon, required this.title, required this.onClick});
@override
Widget build(BuildContext context) {
@ -29,12 +27,8 @@ class ShowImageButton extends StatelessWidget {
color: Colors.white,
),
),
mHeight(12),
Txt(
title,
txtType: TxtType.heading2,
color: Colors.blue,
)
12.height,
title.toText22(color: Colors.blue)
],
),
),

@ -1,14 +1,13 @@
import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/navigator.dart';
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/widgets/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:flutter/material.dart';
class MessageDialog extends StatelessWidget {
String? title, buttonTitle;
VoidCallback? onClick;
MessageDialog({this.title, this.buttonTitle,this.onClick});
MessageDialog({this.title, this.buttonTitle, this.onClick});
@override
Widget build(BuildContext context) {
@ -19,11 +18,8 @@ class MessageDialog extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Txt(
title ?? "message",
txtType: TxtType.heading3,
),
mHeight(40),
(title ?? "message").toText16(),
40.height,
ShowFillButton(
title: buttonTitle ?? "Continue",
width: double.infinity,

@ -1,8 +1,7 @@
import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/navigator.dart';
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:car_provider_app/widgets/show_fill_button.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:flutter/material.dart';
class OtpDialog extends StatelessWidget {
@ -19,11 +18,8 @@ class OtpDialog extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Txt(
"Please insert OTP Code",
txtType: TxtType.heading3,
),
mHeight(20),
"Please insert OTP Code".toText16(),
20.height,
Row(
children: [
Expanded(
@ -33,7 +29,7 @@ class OtpDialog extends StatelessWidget {
color: accentColor.withOpacity(0.3),
),
),
mWidth(12),
12.height,
Expanded(
child: Container(
width: double.infinity,
@ -41,7 +37,7 @@ class OtpDialog extends StatelessWidget {
color: accentColor.withOpacity(0.3),
),
),
mWidth(12),
12.height,
Expanded(
child: Container(
width: double.infinity,
@ -49,7 +45,7 @@ class OtpDialog extends StatelessWidget {
color: accentColor.withOpacity(0.3),
),
),
mWidth(12),
12.height,
Expanded(
child: Container(
width: double.infinity,
@ -59,7 +55,7 @@ class OtpDialog extends StatelessWidget {
),
],
),
mHeight(40),
40.height,
ShowFillButton(
title: "Check Code",
width: double.infinity,

@ -1,10 +1,7 @@
import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:flutter/material.dart';
import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/utils.dart';
import '../txt.dart';
class DropdownField extends StatefulWidget {
String? hint;
@ -39,12 +36,7 @@ class _DropdownFieldState extends State<DropdownField> {
iconDisabledColor: borderColor,
isExpanded: true,
style: const TextStyle(color: Colors.black),
hint: Txt(
widget.hint ?? "",
txtType: TxtType.heading1,
bold: false,
color: borderColor,
),
hint: (widget.hint ?? "").toText24(color: borderColor),
underline: Container(
height: 0,
),
@ -64,11 +56,7 @@ class _DropdownFieldState extends State<DropdownField> {
(String value) {
return DropdownMenuItem<String>(
value: value,
child: Txt(
value,
txtType: TxtType.heading1,
bold: false,
),
child: value.toText24(),
);
},
).toList(),

@ -1,9 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:car_provider_app/config/constants.dart';
import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
class DropDownText extends StatelessWidget {
String title;
@ -16,12 +16,8 @@ class DropDownText extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Txt(
title,
txtType: TxtType.heading3,
color: accentColor,
),
mWidth(16),
title.toText16(color: accentColor),
16.height,
SvgPicture.asset(
svgIcons + "ic_arrow_down.svg",
width: 10,

@ -0,0 +1,7 @@
import 'package:flutter/cupertino.dart';
extension IntExtensions on int {
Widget get height => SizedBox(height: toDouble());
Widget get width => SizedBox(width: toDouble());
}

@ -0,0 +1,109 @@
import 'package:car_provider_app/theme/colors.dart';
import 'package:flutter/cupertino.dart';
import 'package:intl/intl.dart';
extension EmailValidator on String {
Widget get toWidget => Text(this);
Widget toText10({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(fontSize: 10, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? headingColor, letterSpacing: -0.4),
);
Widget toText11({Color? color, bool isUnderLine = false, bool isBold = false}) => Text(
this,
style: TextStyle(
fontSize: 11,
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
color: color ?? headingColor,
letterSpacing: -0.33,
decoration: isUnderLine ? TextDecoration.underline : null),
);
Widget toText12({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, int maxLine = 0}) => Text(
this,
textAlign: isCenter ? TextAlign.center : null,
maxLines: (maxLine > 0) ? maxLine : null,
style: TextStyle(
fontSize: 12,
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
color: color ?? headingColor,
letterSpacing: -0.72,
decoration: isUnderLine ? TextDecoration.underline : null),
);
Widget toText13({Color? color, bool isUnderLine = false}) => Text(
this,
style: TextStyle(fontSize: 13, fontWeight: FontWeight.w600, color: color ?? headingColor, letterSpacing: -0.52, decoration: isUnderLine ? TextDecoration.underline : null),
);
Widget toText14({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(color: color ?? headingColor, fontSize: 14, letterSpacing: -0.48, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
);
Widget toText16({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(color: color ?? headingColor, fontSize: 16, letterSpacing: -0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
);
Widget toText17({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(color: color ?? headingColor, fontSize: 17, letterSpacing: -0.68, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
);
Widget toText22({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(height: 1, color: color ?? headingColor, fontSize: 22, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
);
Widget toText24({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(height: 23 / 24, color: color ?? headingColor, fontSize: 24, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
);
Widget toText32({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(height: 32 / 32, color: color ?? headingColor, fontSize: 32, letterSpacing: -1.92, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
);
bool isValidEmail() {
return RegExp(r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$').hasMatch(this);
}
String toFormattedDate() {
String date = this.split("T")[0];
String time = this.split("T")[1];
var dates = date.split("-");
return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}";
}
getMonth(int month) {
switch (month) {
case 1:
return "January";
case 2:
return "February";
case 3:
return "March";
case 4:
return "April";
case 5:
return "May";
case 6:
return "June";
case 7:
return "July";
case 8:
return "August";
case 9:
return "September";
case 10:
return "October";
case 11:
return "November";
case 12:
return "December";
}
}
}

@ -0,0 +1,11 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
extension WidgetExtensions on Widget {
Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this);
Widget paddingAll(double _value) => Padding(padding: EdgeInsets.all(_value), 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);
}

@ -1,12 +1,12 @@
import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:flutter/material.dart';
class ShowFillButton extends StatelessWidget {
String title;
VoidCallback onPressed;
Color txtColor;
double elevation, radius,width;
double elevation, radius, width;
ShowFillButton({
required this.title,
@ -14,28 +14,23 @@ class ShowFillButton extends StatelessWidget {
this.txtColor = Colors.white,
this.elevation = 4,
this.radius = 6,
this.width=88,
this.width = 88,
});
@override
Widget build(BuildContext context) {
return ElevatedButton(
style: ElevatedButton.styleFrom(
onPrimary: Colors.black87,
primary: accentColor,
minimumSize: Size(width, 45),
padding: EdgeInsets.symmetric(horizontal: 16),
elevation: elevation,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(radius)),
style: ElevatedButton.styleFrom(
onPrimary: Colors.black87,
primary: accentColor,
minimumSize: Size(width, 45),
padding: EdgeInsets.symmetric(horizontal: 16),
elevation: elevation,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(radius)),
),
),
),
onPressed: onPressed,
child: Txt(
title.toUpperCase(),
color: txtColor,
txtType: TxtType.heading1,
),
);
onPressed: onPressed,
child: title.toUpperCase().toText22(color: txtColor));
}
}

@ -1,170 +0,0 @@
// import 'package:auto_size_text/auto_size_text.dart';
import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/utils.dart';
import 'package:flutter/material.dart';
import 'package:sizer/sizer.dart';
enum TxtType {
small,
normal,
heading1,
heading2,
heading3,
appBar,
}
class Txt extends StatelessWidget {
String text;
int? maxLines;
double? fontSize;
Color? color;
bool? bold;
bool? isUnderline;
bool? isFlatButton;
double? pedding;
TextAlign? textAlign;
FontWeight? fontWeight;
Function? onTap;
TxtType txtType;
Txt(this.text, {this.maxLines, this.color, this.bold, this.fontSize, this.isUnderline, this.isFlatButton, this.pedding, this.textAlign, this.fontWeight, this.onTap, this.txtType = TxtType.normal});
@override
Widget build(BuildContext context) {
if (isFlatButton != null)
return Padding(
padding: EdgeInsets.only(right: pedding ?? 0, left: pedding ?? 0),
child: InkWell(
onTap: () {
onTap!();
},
customBorder: inkWellCorner(r: 4),
child: Padding(
padding: const EdgeInsets.only(
left: 14,
right: 14,
top: 6,
bottom: 6,
),
child: getText(),
),
),
);
else
return getText();
}
Widget getText() {
return Material(
type: MaterialType.transparency,
child: Text(
text,
maxLines: maxLines,
textAlign: textAlign,
overflow: maxLines != null ? TextOverflow.ellipsis : null,
style: TextStyle(
fontSize: fontSize ??
(txtType == TxtType.small
? 8.sp
: txtType == TxtType.normal
? 10.sp
: txtType == TxtType.heading1
? 11.sp
: txtType == TxtType.heading2
? 12.sp
: txtType == TxtType.heading3
? 13.sp
: txtType == TxtType.appBar
? 14.sp
: 8.sp),
color: color ??
(txtType == TxtType.appBar
? Colors.black
: txtType == TxtType.heading1
? headingColor
: txtType == TxtType.heading2
? headingColor
: txtType == TxtType.heading3
? headingColor
: null),
fontWeight: (fontWeight != null)
? fontWeight
: ((bold != null)
? FontWeight.bold
: (txtType == TxtType.appBar
? FontWeight.bold
: txtType == TxtType.heading1
? FontWeight.bold
: txtType == TxtType.heading2
? FontWeight.bold
: txtType == TxtType.heading3
? FontWeight.bold
: null)),
decoration: (isUnderline != null) ? TextDecoration.underline : null,
),
),
);
}
}
// class TxtAuto extends StatelessWidget {
// String text;
// int? maxLines;
// double? fontSize;
// Color? color;
// bool? bold;
// bool? isUnderline;
// bool? isFlatButton;
// double? pedding;
// TextAlign? textAlign;
//
// TxtAuto(
// this.text, {
// this.maxLines,
// this.color,
// this.bold,
// this.fontSize,
// this.isUnderline,
// this.isFlatButton,
// this.pedding,
// this.textAlign,
// });
//
// @override
// Widget build(BuildContext context) {
// if (isFlatButton != null)
// return Padding(
// padding: EdgeInsets.only(right: pedding ?? 0, left: pedding ?? 0),
// child: InkWell(
// onTap: () {},
// customBorder: inkWellCorner(r: 4),
// child: Padding(
// padding: const EdgeInsets.only(
// left: 14,
// right: 14,
// top: 6,
// bottom: 6,
// ),
// child: getText(),
// ),
// ),
// );
// else
// return getText();
// }
//
// Widget getText() {
// return AutoSizeText(
// text,
// maxLines: maxLines,
// textAlign: textAlign,
// overflow: maxLines != null ? TextOverflow.ellipsis : null,
// style: TextStyle(
// fontSize: fontSize,
// color: color,
// fontWeight: (bold != null) ? FontWeight.bold : null,
// decoration: (isUnderline != null) ? TextDecoration.underline : null,
// ),
// );
// }
// }

@ -1,6 +1,7 @@
import 'package:car_provider_app/theme/colors.dart';
import 'package:car_provider_app/utils/utils.dart';
import 'package:car_provider_app/widgets/txt.dart';
import 'package:car_provider_app/widgets/extensions/int_extensions.dart';
import 'package:car_provider_app/widgets/extensions/string_extensions.dart';
import 'package:flutter/material.dart';
import 'package:sizer/sizer.dart';
@ -65,18 +66,15 @@ class TxtField extends StatelessWidget {
alignLabelWithHint: true,
fillColor: Colors.white,
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: accentColor, width: isNeedBorder ? 1.0 : 0),
borderSide: BorderSide(color: accentColor, width: isNeedBorder ? 1.0 : 0),
borderRadius: BorderRadius.circular(4.0),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: borderColor, width: isNeedBorder ? 1.0 : 0),
borderSide: BorderSide(color: borderColor, width: isNeedBorder ? 1.0 : 0),
borderRadius: BorderRadius.circular(4.0),
),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: borderColor, width: isNeedBorder ? 1.0 : 0),
borderSide: BorderSide(color: borderColor, width: isNeedBorder ? 1.0 : 0),
borderRadius: BorderRadius.circular(4.0),
),
prefixIcon: prefixData != null
@ -100,7 +98,7 @@ class TxtField extends StatelessWidget {
),
),
),
if (isNeedFilterButton) mWidth(8),
if (isNeedFilterButton) 8.width,
if (isNeedFilterButton)
InkWell(
onTap: isNeedClickAll
@ -136,12 +134,7 @@ class TxtField extends StatelessWidget {
child: Center(
child: Padding(
padding: const EdgeInsets.only(left: 12, right: 12),
child: Txt(
buttonTitle ?? "Search",
color: Colors.white,
fontSize: 18,
bold: true,
),
child: (buttonTitle ?? "Search").toText17(isBold: true, color: Colors.white),
),
),
),

@ -14,7 +14,7 @@ packages:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.8.1"
version: "2.8.2"
boolean_selector:
dependency: transitive
description:
@ -28,7 +28,7 @@ packages:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
version: "1.2.0"
charcode:
dependency: transitive
description:
@ -181,7 +181,7 @@ packages:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.10"
version: "0.12.11"
meta:
dependency: transitive
description:
@ -424,7 +424,7 @@ packages:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.2"
version: "0.4.3"
typed_data:
dependency: transitive
description:
@ -445,7 +445,7 @@ packages:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
version: "2.1.1"
win32:
dependency: transitive
description:

Loading…
Cancel
Save