Merge branch 'master' of gitlab.com:Cloud_Solution/driver-app into delivery_confirmed

# Conflicts:
#	lib/pages/landing/landing_page.dart
logut
enadhilal 4 years ago
commit 5e604c4778

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

@ -0,0 +1,87 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def parse_KV_file(file, separator='=')
file_abs_path = File.expand_path(file)
if !File.exists? file_abs_path
return [];
end
generated_key_values = {}
skip_line_start_symbols = ["#", "/"]
File.foreach(file_abs_path) do |line|
next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
plugin = line.split(pattern=separator)
if plugin.length == 2
podname = plugin[0].strip()
path = plugin[1].strip()
podpath = File.expand_path("#{path}", file_abs_path)
generated_key_values[podname] = podpath
else
puts "Invalid plugin specification: #{line}"
end
end
generated_key_values
end
target 'Runner' do
use_frameworks!
use_modular_headers!
# Flutter Pod
copied_flutter_dir = File.join(__dir__, 'Flutter')
copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework')
copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec')
unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path)
# Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet.
# That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration.
# CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist.
generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig')
unless File.exist?(generated_xcode_build_settings_path)
raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path)
cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR'];
unless File.exist?(copied_framework_path)
FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir)
end
unless File.exist?(copied_podspec_path)
FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir)
end
end
# Keep pod path relative so it can be checked into Podfile.lock.
pod 'Flutter', :path => 'Flutter'
# Plugin Pods
# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
# referring to absolute paths on developers' machines.
system('rm -rf .symlinks')
system('mkdir -p .symlinks/plugins')
plugin_pods = parse_KV_file('../.flutter-plugins')
plugin_pods.each do |name, path|
symlink = File.join('.symlinks', 'plugins', name)
File.symlink(path, symlink)
pod name, :path => File.join(symlink, 'ios')
end
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = 'NO'
end
end
end

@ -225,12 +225,47 @@
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
"${PODS_ROOT}/../Flutter/Flutter.framework",
"${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework",
"${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework",
"${BUILT_PRODUCTS_DIR}/SwiftProtobuf/SwiftProtobuf.framework",
"${BUILT_PRODUCTS_DIR}/TOCropViewController/TOCropViewController.framework",
"${BUILT_PRODUCTS_DIR}/barcode_scan/barcode_scan.framework",
"${BUILT_PRODUCTS_DIR}/connectivity/connectivity.framework",
"${BUILT_PRODUCTS_DIR}/device_info/device_info.framework",
"${BUILT_PRODUCTS_DIR}/flutter_flexible_toast/flutter_flexible_toast.framework",
"${BUILT_PRODUCTS_DIR}/flutter_local_notifications/flutter_local_notifications.framework",
"${BUILT_PRODUCTS_DIR}/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework",
"${BUILT_PRODUCTS_DIR}/hexcolor/hexcolor.framework",
"${BUILT_PRODUCTS_DIR}/image_cropper/image_cropper.framework",
"${BUILT_PRODUCTS_DIR}/image_picker/image_picker.framework",
"${BUILT_PRODUCTS_DIR}/local_auth/local_auth.framework",
"${BUILT_PRODUCTS_DIR}/maps_launcher/maps_launcher.framework",
"${BUILT_PRODUCTS_DIR}/shared_preferences/shared_preferences.framework",
"${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftProtobuf.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TOCropViewController.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/barcode_scan.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_flexible_toast.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_local_notifications.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_plugin_android_lifecycle.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hexcolor.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_cropper.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/local_auth.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/maps_launcher.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;

File diff suppressed because one or more lines are too long

@ -0,0 +1,30 @@
/// Flutter icons DriverApp
/// Copyright (C) 2020 by original authors @ fluttericon.com, fontello.com
/// This font was generated by FlutterIcon.com, which is derived from Fontello.
///
/// To use this font, place it in your fonts/ directory and include the
/// following in your pubspec.yaml
///
/// flutter:
/// fonts:
/// - family: DriverApp
/// fonts:
/// - asset: fonts/DriverApp.ttf
///
///
///
import 'package:flutter/widgets.dart';
class DriverApp {
DriverApp._();
static const _kFontFam = 'DriverApp';
static const _kFontPkg = null;
static const IconData logo = IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData closed_box = IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData location = IconData(0xe804, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData open_box = IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData phone_call = IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData qr = IconData(0xe807, fontFamily: _kFontFam, fontPackage: _kFontPkg);
}

Binary file not shown.

@ -1,4 +1,3 @@
import 'package:flutter/cupertino.dart';
const MAX_SMALL_SCREEN = 660;
@ -6,7 +5,10 @@ const MAX_SMALL_SCREEN = 660;
const BASE_URL = 'https://uat.hmgwebservices.com/Services';
const GET_PROJECT = '/Lists.svc/REST/GetProject';
const LOGIN = "/Authentication.svc/REST/CheckDriverAuthentication";
const GET_ALL_ORDERS = '/Patients.svc/REST/PatientER_Delivery_GetAllOrder';
class AppGlobal {
static BuildContext context;

@ -11,6 +11,28 @@ const Map<String, Map<String, String>> localizedValues = {
'services': {'en': 'SERVICES', 'ar': 'الخدمات'},
'mySchedule': {'en': 'My Schedule', 'ar': 'جدولي'},
'logout': {'en': 'Logout', 'ar': 'تسجيل خروج'},
'booking':{'en': 'Booking','ar':'حجز'}
'booking':{'en': 'Booking','ar':'حجز'},
'enterId': {'en': 'User Name', 'ar': 'اسم المستخدم'},
'pleaseEnterYourID': {
'en': 'Please enter your ',
'ar': 'الرجاء ادخال اسم المستخدم'
},
'enterPassword': {'en': 'Password', 'ar': 'كلمه السر'},
'pleaseEnterPassword': {
'en': 'Please Enter Your Password',
'ar': 'الرجاء ادخال كلمه السر'
},
'enterCredentialsMsg': {
'en': 'Please insert username and password to login',
'ar': 'الرجاء إدخال اسم المستخدم وكلمة المرور لتسجيل الدخول'
},
'forgotPassword': {
'en': 'Forgot Password?',
'ar': 'هل نسيت كلمة المرور ؟'
},
'login': {
'en': 'Login',
'ar': 'تسجيل الدخول'
}
};

@ -1,3 +1,5 @@
const TOKEN = 'token';
const APP_LANGUAGE = 'language';
const USER_PROFILE = 'user-profile';

@ -0,0 +1,64 @@
class AuthenticatedUser {
int iD;
int userID;
String password;
String userName;
int roleID;
String name;
bool active;
String createdOn;
int createdBy;
Null editedOn;
Null editedBy;
String mobileNumber;
int realRoleID;
AuthenticatedUser(
{this.iD,
this.userID,
this.password,
this.userName,
this.roleID,
this.name,
this.active,
this.createdOn,
this.createdBy,
this.editedOn,
this.editedBy,
this.mobileNumber,
this.realRoleID});
AuthenticatedUser.fromJson(Map<String, dynamic> json) {
iD = json['ID'];
userID = json['UserID'];
password = json['password'];
userName = json['UserName'];
roleID = json['RoleID'];
name = json['Name'];
active = json['Active'];
createdOn = json['CreatedOn'];
createdBy = json['CreatedBy'];
editedOn = json['EditedOn'];
editedBy = json['EditedBy'];
mobileNumber = json['MobileNumber'];
realRoleID = json['RealRoleID'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['ID'] = this.iD;
data['UserID'] = this.userID;
data['password'] = this.password;
data['UserName'] = this.userName;
data['RoleID'] = this.roleID;
data['Name'] = this.name;
data['Active'] = this.active;
data['CreatedOn'] = this.createdOn;
data['CreatedBy'] = this.createdBy;
data['EditedOn'] = this.editedOn;
data['EditedBy'] = this.editedBy;
data['MobileNumber'] = this.mobileNumber;
data['RealRoleID'] = this.realRoleID;
return data;
}
}

@ -0,0 +1,18 @@
class LoginRequest {
int userID;
String password;
LoginRequest({this.userID, this.password});
LoginRequest.fromJson(Map<String, dynamic> json) {
userID = json['UserID'];
password = json['Password'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['UserID'] = this.userID;
data['Password'] = this.password;
return data;
}
}

@ -0,0 +1,51 @@
import 'dart:ffi';
class PendingOrders {
int driverID;
String searchKey;
int pageSize;
int pageIndex;
String tokenID;
String userID;
String mobileNo;
String firstName;
String lastName;
String mobileNumber;
PendingOrders(
{this.driverID,
this.searchKey,
this.pageSize,
this.pageIndex,
this.tokenID,
this.userID,
this.mobileNo,
this.firstName,
this.lastName,
this.mobileNumber});
PendingOrders.fromJson(Map<String, dynamic> json) {
driverID = json['DriverID'];
searchKey = json['SearchKey'];
pageSize = json['PageSize'];
pageIndex = json['PageIndex'];
tokenID = json['TokenID'];
userID = json['UserID'];
mobileNo = json['MobileNo'];
firstName = json['FirstName'];
lastName = json['LastName'];
mobileNumber = json['MobileNumber'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['DriverID'] = this.driverID;
data['SearchKey'] = this.searchKey;
data['PageSize'] = this.pageSize;
data['PageIndex'] = this.pageIndex;
data['TokenID'] = this.tokenID;
data['UserID'] = this.userID;
data['MobileNo'] = this.mobileNo;
return data;
}
}

@ -0,0 +1,35 @@
import 'package:driverapp/config/config.dart';
import 'package:driverapp/core/model/authentication/authenticated_user.dart';
import 'package:driverapp/core/model/authentication/login_request.dart';
import 'package:driverapp/core/service/base_service.dart';
class AuthenticationService extends BaseService {
String selectedClinicName;
bool isLogin = false;
bool isLoading = true;
AuthenticatedUser authenticatedUser;
String token;
AuthenticationService() {
// getUserAuthentication();
}
login(LoginRequest loginRequest) async {
hasError = false;
try {
await baseAppClient.post(LOGIN,
onSuccess: (dynamic response, int statusCode) {
authenticatedUser =
AuthenticatedUser.fromJson(response['PatientER_DriverFile']);
token = response['LogInTokenID'];
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: loginRequest.toJson());
} catch (error) {
hasError = true;
super.error = error;
throw error;
}
}
}

@ -1,9 +1,26 @@
import 'package:driverapp/config/shared_pref_kay.dart';
import 'package:driverapp/core/model/authentication/authenticated_user.dart';
import 'package:driverapp/uitl/app_shared_preferences.dart';
import 'client/base_app_client.dart';
class BaseService{
class BaseService {
String error;
bool hasError = false;
BaseAppClient baseAppClient = BaseAppClient();
AuthenticatedUser user;
AppSharedPreferences sharedPref = AppSharedPreferences();
BaseService() {
getUser();
}
getUser() async {
var userProfile = await sharedPref.getObject(USER_PROFILE);
if (userProfile != null) {
user =
AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE));
}
}
}

@ -0,0 +1,31 @@
import 'package:driverapp/config/config.dart';
import 'package:driverapp/core/model/pending_orders/pending_orders_model.dart';
import 'package:driverapp/core/service/base_service.dart';
class PendingOrdersService extends BaseService {
List<PendingOrders> _orders = List();
List<PendingOrders> get orders => _orders;
PendingOrders _requestGetPendingOrders = PendingOrders(
driverID: 1111,
searchKey: "",
pageSize: 0,
pageIndex: 0,
tokenID: "@dm!n",
userID: "1111",
mobileNo: "0541710575",
);
Future getPendingOrders() async {
await baseAppClient.post(GET_ALL_ORDERS,
onSuccess: (dynamic response, int statusCode) {
_orders.clear();
response['PatientER_Delivery_GetAllOrderList'].forEach((order) {
_orders.add(PendingOrders.fromJson(order));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: _requestGetPendingOrders.toJson());
}
}

@ -0,0 +1,40 @@
import 'package:driverapp/config/shared_pref_kay.dart';
import 'package:driverapp/core/enum/viewstate.dart';
import 'package:driverapp/core/model/authentication/login_request.dart';
import 'package:driverapp/core/service/authentication_service.dart';
import 'package:driverapp/core/service/client/base_app_client.dart';
import 'package:driverapp/core/viewModels/base_view_model.dart';
import '../../locator.dart';
enum APP_STATUS { LOADING, UNAUTHENTICATED, AUTHENTICATED }
class AuthenticationViewModel extends BaseViewModel {
AuthenticationService _authenticationService = locator<AuthenticationService>();
APP_STATUS get status {
if (state == ViewState.Busy || state == ViewState.BusyLocal) {
return APP_STATUS.LOADING;
} else {
if ( user != null) {
return APP_STATUS.AUTHENTICATED;
} else {
return APP_STATUS.UNAUTHENTICATED;
}
}
}
login(LoginRequest loginRequest) async {
setState(ViewState.BusyLocal);
await _authenticationService.login(loginRequest);
if (_authenticationService.hasError) {
error = _authenticationService.error;
setState(ViewState.ErrorLocal);
} else {
sharedPref.setObject(
USER_PROFILE, _authenticationService.authenticatedUser);
sharedPref.setString(TOKEN, _authenticationService.token);
setState(ViewState.Idle);
}
}
}

@ -1,4 +1,7 @@
import 'package:driverapp/config/shared_pref_kay.dart';
import 'package:driverapp/core/enum/viewstate.dart';
import 'package:driverapp/core/model/authentication/authenticated_user.dart';
import 'package:driverapp/uitl/app_shared_preferences.dart';
import 'package:flutter/material.dart';
class BaseViewModel extends ChangeNotifier {
@ -6,8 +9,21 @@ class BaseViewModel extends ChangeNotifier {
bool isInternetConnection = true;
ViewState get state => _state;
AuthenticatedUser user;
String error = "";
AppSharedPreferences sharedPref = AppSharedPreferences();
BaseViewModel(){
getUser();
}
getUser() async {
var userProfile = await sharedPref.getObject(USER_PROFILE);
if (userProfile != null) {
user =
AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE));
}
}
//TODO load user details from SP

@ -0,0 +1,21 @@
import 'package:driverapp/core/enum/viewstate.dart';
import 'package:driverapp/core/service/pending_orders_service.dart';
import 'package:driverapp/core/model/pending_orders/pending_orders_model.dart';
import '../../locator.dart';
import 'base_view_model.dart';
class PendingOrdersViewModel extends BaseViewModel {
PendingOrdersService _pendingOrdersService = locator<PendingOrdersService>();
List<PendingOrders> get orders => _pendingOrdersService.orders;
Future getPendingOrders() async {
setState(ViewState.Busy);
await _pendingOrdersService.getPendingOrders();
if (_pendingOrdersService.hasError) {
error = _pendingOrdersService.error;
setState(ViewState.Error);
} else
setState(ViewState.Idle);
}
}

@ -1,6 +1,10 @@
import 'package:get_it/get_it.dart';
import 'core/service/authentication_service.dart';
import 'core/service/hospital_service.dart';
import 'core/service/pending_orders_service.dart';
import 'core/viewModels/authentication_view_model.dart';
import 'core/viewModels/pending_orders_view_model.dart';
import 'core/viewModels/hospital_view_model.dart';
GetIt locator = GetIt.instance;
@ -9,7 +13,11 @@ GetIt locator = GetIt.instance;
void setupLocator() {
/// Services
locator.registerLazySingleton(() => HospitalService());
locator.registerLazySingleton(() => AuthenticationService());
locator.registerLazySingleton(() => PendingOrdersService());
/// View Model
locator.registerFactory(() => HospitalViewModel());
locator.registerFactory(() => AuthenticationViewModel());
locator.registerFactory(() => PendingOrdersViewModel());
}

@ -1,3 +1,4 @@
import 'package:driverapp/root_page.dart';
import 'package:driverapp/uitl/translations_delegate_base.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
@ -6,7 +7,8 @@ import 'package:provider/provider.dart';
import 'config/size_config.dart';
import 'core/viewModels/project_view_model.dart';
import 'locator.dart';
import 'pages/landing/landing_page.dart';
void main() {
setupLocator();
@ -25,7 +27,7 @@ class MyApp extends StatelessWidget {
providers: [
ChangeNotifierProvider<ProjectViewModel>(
create: (context) => ProjectViewModel(),
),
)
],
child: Consumer<ProjectViewModel>(
builder: (context, projectProvider, child) => MaterialApp(
@ -51,8 +53,12 @@ class MyApp extends StatelessWidget {
TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
},
),
scaffoldBackgroundColor:Color.fromRGBO(239, 245, 245, 1) ,
hintColor: Colors.grey[400],
disabledColor: Colors.grey[300],
bottomSheetTheme: BottomSheetThemeData(
backgroundColor: Color.fromRGBO(239, 245, 245, 1)
),
errorColor: Color.fromRGBO(235, 80, 60, 1.0),
textSelectionColor: Color.fromRGBO(80, 100, 253, 0.5),
textSelectionHandleColor: Color.fromRGBO(80, 100, 253, 1.0),
@ -60,9 +66,10 @@ class MyApp extends StatelessWidget {
backgroundColor: Color.fromRGBO(255, 255, 255, 1),
highlightColor: Colors.grey[100].withOpacity(0.4),
splashColor: Colors.transparent,
primaryColor: Colors.grey,
primaryColor: Color.fromRGBO(69, 183, 174, 1.0),
cursorColor: Color.fromRGBO(78, 62, 253, 1.0),
iconTheme: IconThemeData(),
dividerColor: Color.fromRGBO(112, 112, 112, 1.0),
appBarTheme: AppBarTheme(
color: Colors.grey,
brightness: Brightness.light,
@ -73,7 +80,7 @@ class MyApp extends StatelessWidget {
),
),
initialRoute: '/',
routes: {'/': (context) => LandingPage()},
routes: {'/': (context) => RootPage()},
debugShowCheckedModeBanner: false,
),
),

@ -0,0 +1,264 @@
import 'package:driverapp/app-icons/driver_app_icons.dart';
import 'package:driverapp/core/enum/viewstate.dart';
import 'package:driverapp/core/model/authentication/login_request.dart';
import 'package:driverapp/core/viewModels/authentication_view_model.dart';
import 'package:driverapp/core/viewModels/project_view_model.dart';
import 'package:driverapp/pages/base/base_view.dart';
import 'package:driverapp/pages/dashboard/dashboard_screen.dart';
import 'package:driverapp/pages/landing/landing_page.dart';
import 'package:driverapp/uitl/translations_delegate_base.dart';
import 'package:driverapp/uitl/utils.dart';
import 'package:driverapp/widgets/buttons/secondary_button.dart';
import 'package:driverapp/widgets/data_display/circle-container.dart';
import 'package:driverapp/widgets/input/text_field.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart';
class LoginPage extends StatelessWidget {
LoginRequest loginRequest = LoginRequest();
final loginFormKey = GlobalKey<FormState>();
ProjectViewModel projectViewModel;
@override
Widget build(BuildContext context) {
projectViewModel = Provider.of(context);
return AnimatedSwitcher(
duration: Duration(microseconds: 350),
child: BaseView<AuthenticationViewModel>(
builder: (_, model, widget) => Scaffold(
body: SingleChildScrollView(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
FractionallySizedBox(
widthFactor: 0.80,
child: Column(
children: <Widget>[
SizedBox(
height: 40,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
child: Icon(
DriverApp.logo,
size: 70,
color: Theme.of(context).primaryColor,
),
margin: EdgeInsets.only(
right: projectViewModel.isArabic
? 0
: MediaQuery.of(context).size.width * 0.15,
left: !projectViewModel.isArabic
? 0
: MediaQuery.of(context).size.width * 0.15),
),
],
),
SizedBox(
height: 20,
),
Column(
children: <Widget>[
Text(
"Driver",
style: TextStyle(
fontSize: 50, fontWeight: FontWeight.bold),
),
Text(
"Delivery",
style: TextStyle(fontSize: 36, letterSpacing: 1),
),
Text(
"APP",
style: TextStyle(
fontSize: 33,
letterSpacing: 33,
fontWeight: FontWeight.w400),
),
],
),
SizedBox(
height: 30,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircleContainer(
onTap: () => projectViewModel.changeLanguage('en'),
child: Text(
TranslationBase.of(context).lanEnglish,
style: TextStyle(
fontSize: 12,
color: projectViewModel.isArabic
? Colors.black
: Colors.white),
),
color: projectViewModel.isArabic
? Colors.transparent
: Theme.of(context).primaryColor,
borderWidth: projectViewModel.isArabic ? 3 : 0,
borderColor: projectViewModel.isArabic
? Theme.of(context).primaryColor
: Colors.transparent,
),
SizedBox(
width: 20,
),
CircleContainer(
onTap: () =>
projectViewModel.changeLanguage('ar'),
child: Text(
TranslationBase.of(context).lanArabic,
style: TextStyle(
fontSize: 12,
color: !projectViewModel.isArabic
? Colors.black
: Colors.white),
),
color: !projectViewModel.isArabic
? Colors.transparent
: Theme.of(context).primaryColor,
borderWidth: !projectViewModel.isArabic ? 3 : 0,
borderColor: !projectViewModel.isArabic
? Theme.of(context).primaryColor
: Colors.transparent),
],
),
SizedBox(
height: 10,
),
Form(
key: loginFormKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 20),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Expanded(
child: Text(
TranslationBase.of(context).enterCredentialsMsg,
style: TextStyle(
fontSize: 13, color: Colors.grey),
),
),
SizedBox(
height: 10,
)
],
),
),
SizedBox(
height: 10,
),
Container(
child: TextFields(
hintText: TranslationBase.of(context).enterId,
validator: (value) {
if (value.isEmpty) {
return TranslationBase.of(context)
.pleaseEnterYourID;
}
return null;
},
onSaved: (value) {
loginRequest.userID = int.parse(value.trim());
},
),
),
SizedBox(
height: 20,
),
Container(
child: TextFields(
borderRadiusValue: 6,
hintText:
TranslationBase.of(context).enterPassword,
validator: (value) {
if (value.isEmpty) {
return TranslationBase.of(context)
.pleaseEnterPassword;
}
return null;
},
onSaved: (value) {
loginRequest.password = value;
},
),
),
SizedBox(
height: 25,
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Text(
TranslationBase.of(context).forgotPassword,
style: TextStyle(
fontSize: 14,
color: Theme.of(context).primaryColor),
),
],
),
],
),
),
],
),
),
SizedBox(
height: 20,
),
SizedBox(
height: 10,
),Container(
margin: EdgeInsets.all(10),
height: MediaQuery.of(context).size.height * 0.22,
child: Column(
children: <Widget>[
SecondaryButton(
label: TranslationBase.of(context).login,
onTap: () {
login(model, context);
},
disabled: model.state == ViewState.BusyLocal,
loading: model.state == ViewState.BusyLocal,
),
SizedBox(
height: 30,
)
],
))
],
),
),
),
),
),
);
}
login(AuthenticationViewModel model, BuildContext context) async {
if (loginFormKey.currentState.validate()) {
loginFormKey.currentState.save();
await model.login(loginRequest);
if (model.state == ViewState.ErrorLocal) {
Utils.showErrorToast(model.error);
} else {
Navigator.push(
context, MaterialPageRoute(builder: (context) => DashboardScreen()));
}
}
}
}

@ -0,0 +1,395 @@
import 'package:driverapp/config/size_config.dart';
import 'package:driverapp/core/viewModels/pending_orders_view_model.dart';
import 'package:flutter/material.dart';
import '../base/base_view.dart';
import 'package:flutter/cupertino.dart';
import 'package:driverapp/app-icons/driver_app_icons.dart';
import 'package:driverapp/widgets/others/rounded_container.dart';
import 'package:driverapp/pages/orders/pending_orders_page.dart';
class DashboardScreen extends StatefulWidget {
@override
_DashboardScreenState createState() => _DashboardScreenState();
}
class _DashboardScreenState extends State<DashboardScreen> {
@override
Widget build(BuildContext context) {
return BaseView<PendingOrdersViewModel>(
onModelReady: (model) => model.getPendingOrders(),
builder:
(BuildContext context, PendingOrdersViewModel model, Widget child) =>
Scaffold(
backgroundColor: Color(0xffF4F9FA),
body: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'Have a great day ,',
style: TextStyle(fontSize: 12.5),
),
Padding(
padding: EdgeInsets.only(top: 4.5),
child: Text(
'Driver Name',
style: TextStyle(
fontWeight: FontWeight.w400, fontSize: 25.0),
),
),
],
),
],
),
),
Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
CircleAvatar(
radius: 25.5,
backgroundColor: Color(0xff30B7B9),
child: CircleAvatar(
backgroundColor: Color(0xff30B7B9),
maxRadius: 26.0,
child: Image.asset(
'assets/images/driver.png',
fit: BoxFit.contain,
),
),
),
],
),
),
],
),
Row(
children: <Widget>[
Column(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(horizontal: 12.0),
child: Container(
height: MediaQuery.of(context).size.height * 0.15,
width: MediaQuery.of(context).size.width * 0.43,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
gradient: LinearGradient(
colors: [Color(0xff17AFB8), Color(0xff49C1BC)]),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Padding(
padding: EdgeInsets.all(12.0),
child: Column(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text(
'You Have',
style: TextStyle(
color: Colors.white, fontSize: 10.0),
),
Text(
'5',
style: TextStyle(
color: Colors.white, fontSize: 25.0),
),
Text(
'Undelivered \n Packages',
style: TextStyle(
color: Colors.white, fontSize: 10.0),
)
],
),
),
Padding(
padding: EdgeInsets.all(4.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: EdgeInsets.only(right: 9.5),
child: Image.asset(
'assets/images/closed_box.png',
height:
MediaQuery.of(context).size.height *
0.09,
width:
MediaQuery.of(context).size.width *
0.20,
//fit: BoxFit.cover,
)),
],
),
)
],
),
),
)
],
),
Column(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(horizontal: 12.0),
child: Container(
height: MediaQuery.of(context).size.height * 0.15,
width: MediaQuery.of(context).size.width * 0.43,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
gradient: LinearGradient(
colors: [Color(0xff17AFB8), Color(0xff49C1BC)]),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Padding(
padding: EdgeInsets.all(12.0),
child: Column(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text(
'You Have',
style: TextStyle(
color: Colors.white, fontSize: 10.0),
),
Text(
'25',
style: TextStyle(
color: Colors.white, fontSize: 25.0),
),
Text(
'unWanted\n Packge',
style: TextStyle(
color: Colors.white, fontSize: 10.0),
)
],
),
),
Padding(
padding: EdgeInsets.only(right: 9.5),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image.asset(
'assets/images/open_box.png',
height: MediaQuery.of(context).size.height *
0.11,
width: MediaQuery.of(context).size.width *
0.24,
scale: 0.9,
fit: BoxFit.cover,
),
],
),
),
],
),
),
)
],
),
],
),
Padding(
padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 12.0),
child: Row(
children: <Widget>[
Expanded(
child: InkWell(
child: Container(
height: 140,
width: 350,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
gradient: LinearGradient(colors: [
Color(0xff48C0BC),
Color(0xff17AFB8)
])),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image.asset(
'assets/images/qr_code.png',
width:
MediaQuery.of(context).size.width * 0.25,
height:
MediaQuery.of(context).size.height * 0.14,
fit: BoxFit.fitHeight,
)
],
),
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'SCAN',
style: TextStyle(
fontSize: 35.0, color: Colors.white),
),
Padding(
padding: EdgeInsets.only(top: 6.0),
child: Text(
'To add package to que ',
style: TextStyle(
fontSize: 12.0,
color: Colors.white,
letterSpacing: 0.5,
wordSpacing: 5.5,
),
),
),
],
)
],
),
),
),
)
],
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 12.0, vertical: 10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Column(
children: <Widget>[
Text(
'Nearest Drop-Offs',
style: TextStyle(
fontSize: 21.0,
fontWeight: FontWeight.w400,
),
),
],
),
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
InkWell(
child: Row(
children: <Widget>[
Text(
'See All',
style: TextStyle(fontSize: 14.5),
),
Icon(
Icons.arrow_forward_ios,
size: 15.0,
),
],
),
onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (context) => OrdersListScreen()),
)),
],
),
],
),
),
Column(
children: <Widget>[
ListView.builder(
shrinkWrap: true,
scrollDirection: Axis.vertical,
itemCount: //model.orders == null ? 0 : model.orders.length,
2,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 12.0),
child: RoundedContainer(
height: SizeConfig.heightMultiplier * 10.5,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: EdgeInsets.only(left: 22.0),
child: Image.asset(
'assets/images/location.png'),
)
],
),
if (model.orders.length != 0)
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
model.orders[index].firstName +
' ' +
model.orders[index].lastName,
style: TextStyle(fontSize: 20.0),
),
Text(
model.orders[index].mobileNumber,
style: TextStyle(
color: Color(0xff30B7B9),
fontWeight: FontWeight.w600,
fontSize: 15.0),
),
Text(
'Olaya ST, Behind kfc next to king-\ndom tower 2nd floor n.o 247',
style: TextStyle(color: Colors.black45),
)
],
),
Padding(
padding: EdgeInsets.all(10.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircleAvatar(
backgroundColor: Colors.black45,
radius: 30.0,
child: CircleAvatar(
backgroundColor: Colors.white,
maxRadius: 28.9,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'3 K.m \n away',
style: TextStyle(
color: Color(0xff30B7B9),
fontSize: 14.0),
),
),
),
)
],
),
)
],
),
),
);
})
],
)
],
),
),
);
}
}

@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
import 'package:driverapp/config/size_config.dart';
import 'package:driverapp/core/viewModels/pending_orders_view_model.dart';
import '../base/base_view.dart';
import 'package:flutter/cupertino.dart';
import 'package:driverapp/widgets/others/rounded_container.dart';
class OrdersListScreen extends StatefulWidget {
@override
_OrdersListScreenState createState() => _OrdersListScreenState();
}
class _OrdersListScreenState extends State<OrdersListScreen> {
@override
Widget build(BuildContext context) {
return BaseView<PendingOrdersViewModel>(
onModelReady: (model) => model.getPendingOrders(),
builder:
(BuildContext context, PendingOrdersViewModel model, Widget child) =>
Scaffold(
appBar: AppBar(
centerTitle: true,
backgroundColor: Color(0xffF4F9FA),
title: Text(
'Your Delivery Que',
),
),
),
);
}
}

@ -0,0 +1,35 @@
import 'package:driverapp/pages/authentication/login_page.dart';
import 'package:driverapp/pages/base/base_view.dart';
import 'package:driverapp/pages/landing/landing_page.dart';
import 'package:driverapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:driverapp/pages/dashboard/dashboard_screen.dart';
import 'core/viewModels/authentication_view_model.dart';
class RootPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
Widget buildRoot(APP_STATUS status) {
switch (status) {
case APP_STATUS.UNAUTHENTICATED:
return LoginPage ();
break;
case APP_STATUS.AUTHENTICATED:
return DashboardScreen();
break;
}
}
return AnimatedSwitcher(
duration: Duration(microseconds: 350),
child: BaseView<AuthenticationViewModel>(
builder: (_, model, widget) => AppScaffold(
baseViewModel: model,
body: buildRoot((model.status)),
),
),
);
}
}

@ -39,6 +39,19 @@ class TranslationBase {
String get logout => localizedValues['logout'][locale.languageCode];
String get booking => localizedValues['booking'][locale.languageCode];
String get enterId => localizedValues['enterId'][locale.languageCode];
String get pleaseEnterYourID =>
localizedValues['pleaseEnterYourID'][locale.languageCode];
String get enterPassword =>
localizedValues['enterPassword'][locale.languageCode];
String get pleaseEnterPassword =>
localizedValues['pleaseEnterPassword'][locale.languageCode];
String get english => localizedValues['english'][locale.languageCode];
String get arabic => localizedValues['arabic'][locale.languageCode];
String get enterCredentialsMsg => localizedValues['enterCredentialsMsg'][locale.languageCode];
String get forgotPassword => localizedValues['forgotPassword'][locale.languageCode];
String get login => localizedValues['login'][locale.languageCode];
}
class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> {

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
/// SecondaryButton widget
/// [label] button label
@ -87,6 +88,7 @@ class _SecondaryButtonState extends State<SecondaryButton>
_rippleSize = _rippleAnimation.value;
});
});
super.initState();
}
@ -160,17 +162,22 @@ class _SecondaryButtonState extends State<SecondaryButton>
child: ClipRRect(
borderRadius: widget.noBorderRadius
? BorderRadius.all(Radius.circular(0.0))
: BorderRadius.all(Radius.circular(10.0)),
: BorderRadius.all(Radius.circular(40.0)),
child: Stack(
children: <Widget>[
Positioned(
left: 0,
bottom: 0,
child: Container(
width: MediaQuery.of(context).size.width,
width: MediaQuery
.of(context)
.size
.width,
height: 100,
decoration: BoxDecoration(
color: Theme.of(context).disabledColor,
color: Theme
.of(context)
.disabledColor,
),
),
),
@ -184,7 +191,8 @@ class _SecondaryButtonState extends State<SecondaryButton>
height: MediaQuery.of(context).size.width * 2.2,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: widget.color,
color: widget.color != null ? widget.color : Hexcolor(
"#1CA4AA"),
),
),
),
@ -193,8 +201,8 @@ class _SecondaryButtonState extends State<SecondaryButton>
padding: widget.iconOnly
? EdgeInsets.symmetric(vertical: 4.0, horizontal: 5.0)
: EdgeInsets.only(
top: widget.small ? 8.0 : 14.0,
bottom: widget.small ? 6.0 : 14.0,
top: widget.small ? 8.0 : 12.0,
bottom: widget.small ? 6.0 : 12.0,
left: 18.0,
right: 18.0),
child: Stack(
@ -223,12 +231,13 @@ class _SecondaryButtonState extends State<SecondaryButton>
)
: Padding(
padding: EdgeInsets.only(
bottom: widget.small ? 4.0 : 3.0),
bottom: widget.small ? 4.0 : 2.0),
child: Text(widget.label,
style: TextStyle(
color: widget.textColor,
color: widget.textColor != null
? widget.textColor
: Colors.white,
fontSize: 17.0,
fontWeight: FontWeight.w800,
fontFamily: "WorkSans")),
)
],

@ -0,0 +1,34 @@
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
class CircleContainer extends StatelessWidget {
const CircleContainer(
{this.child,
this.color = Colors.white,
this.borderColor,
this.borderWidth = 2.0,
this.onTap});
final Widget child;
final Color color;
final Color borderColor;
final double borderWidth;
final Function onTap;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: onTap,
child: Container(
child: Center(child: child),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: color,
border: Border.all(
color: borderColor ?? Hexcolor("#707070"), width: borderWidth)),
height: 60,
width: 60,
),
);
}
}

@ -39,8 +39,7 @@ class NumberTextInputFormatter extends TextInputFormatter {
final _mobileFormatter = NumberTextInputFormatter();
class TextFields extends StatefulWidget {
TextFields(
{Key key,
TextFields({Key key,
this.type,
this.hintText,
this.suffixIcon,
@ -58,6 +57,7 @@ class TextFields extends StatefulWidget {
this.onSubmit,
this.keepPadding = true,
this.textCapitalization = TextCapitalization.none,
this.onTap,
this.controller,
this.keyboardType,
this.validator,
@ -68,9 +68,15 @@ class TextFields extends StatefulWidget {
this.maxLength,
this.prefixIcon,
this.bare = false,
this.fontSize = 16.0,
this.fontWeight = FontWeight.w700,
this.autoValidate = false})
this.fontSize = 14.0,
this.color = Colors.black,
this.fontWeight = FontWeight.w600,
this.autoValidate = false,
this.borderRadiusValue = 8.0,
this.borderWidth = 1.5,
this.fieldTextColor,
this.textAlign = TextAlign.start,
this.borderRadius})
: super(key: key);
final String hintText;
@ -80,6 +86,7 @@ class TextFields extends StatefulWidget {
final IconData suffixIcon;
final Color suffixIconColor;
final IconData prefixIcon;
final VoidCallback onTap;
final TextEditingController controller;
final TextInputType keyboardType;
final FormFieldValidator validator;
@ -96,6 +103,7 @@ class TextFields extends StatefulWidget {
final TextInputAction inputAction;
final double fontSize;
final FontWeight fontWeight;
final Color color;
final bool keepPadding;
final TextCapitalization textCapitalization;
final List<TextInputFormatter> inputFormatters;
@ -103,6 +111,11 @@ class TextFields extends StatefulWidget {
final EdgeInsets padding;
final bool focus;
final bool borderOnlyError;
final double borderRadiusValue;
final BorderRadius borderRadius;
final double borderWidth;
final Color fieldTextColor;
final TextAlign textAlign;
@override
_TextFieldsState createState() => _TextFieldsState();
@ -138,23 +151,20 @@ class _TextFieldsState extends State<TextFields> {
Widget _buildSuffixIcon() {
switch (widget.type) {
case "password":
{
return Padding(
padding: const EdgeInsets.only(right: 8.0),
child: view
? InkWell(
onTap: () {
this.setState(
() {
this.setState(() {
view = false;
});
},
);
},
child: Icon(
EvaIcons.eye,
size: 24.0,
color: Color.fromRGBO(78, 62, 253, 1.0),
),
)
child: Icon(EvaIcons.eye,
size: 24.0, color: Theme
.of(context)
.primaryColor))
: InkWell(
onTap: () {
this.setState(() {
@ -162,9 +172,16 @@ class _TextFieldsState extends State<TextFields> {
});
},
child: Icon(EvaIcons.eyeOff,
size: 24.0, color: Colors.grey[500]),
),
);
size: 24.0, color: Colors.grey[500])));
}
case "hourly":
return Align(
alignment: Alignment.centerRight,
child: Text(
'/ hr ',
style: TextStyle(fontSize: 18, fontWeight: FontWeight.w700),
));
break;
default:
if (widget.suffixIcon != null)
return InkWell(
@ -173,8 +190,7 @@ class _TextFieldsState extends State<TextFields> {
size: 22.0,
color: widget.suffixIconColor != null
? widget.suffixIconColor
: Colors.grey[500]),
);
: Colors.grey[500]));
else
return null;
}
@ -197,14 +213,18 @@ class _TextFieldsState extends State<TextFields> {
? null
: BoxDecoration(boxShadow: [
BoxShadow(
color: Color.fromRGBO(110, 68, 80, focus ? 0.20 : 0),
color: Color.fromRGBO(70, 68, 167, focus ? 0.20 : 0),
offset: Offset(0.0, 13.0),
blurRadius: focus ? 34.0 : 12.0)
]),
child: TextFormField(
keyboardAppearance: Theme.of(context).brightness,
keyboardAppearance: Theme
.of(context)
.brightness,
scrollPhysics: BouncingScrollPhysics(),
autovalidate: widget.autoValidate,
onTap: widget.onTap,
textAlign: widget.textAlign,
textCapitalization: widget.textCapitalization,
onFieldSubmitted: widget.inputAction == TextInputAction.next
? (widget.onSubmit != null
@ -228,10 +248,14 @@ class _TextFieldsState extends State<TextFields> {
autofocus: widget.autoFocus ?? false,
validator: widget.validator,
onSaved: widget.onSaved,
style: Theme.of(context)
style: Theme
.of(context)
.textTheme
.body2
.copyWith(fontSize: widget.fontSize, fontWeight: widget.fontWeight),
.copyWith(
fontSize: widget.fontSize,
fontWeight: widget.fontWeight,
color: widget.color),
inputFormatters: widget.keyboardType == TextInputType.phone
? <TextInputFormatter>[
WhitelistingTextInputFormatter.digitsOnly,
@ -244,7 +268,9 @@ class _TextFieldsState extends State<TextFields> {
hintStyle: TextStyle(
fontSize: widget.fontSize,
fontWeight: widget.fontWeight,
color: Theme.of(context).hintColor),
color: Theme
.of(context)
.hintColor),
contentPadding: widget.padding != null
? widget.padding
: EdgeInsets.symmetric(
@ -253,7 +279,11 @@ class _TextFieldsState extends State<TextFields> {
filled: true,
fillColor: widget.bare
? Colors.transparent
: Theme.of(context).backgroundColor,
: widget.fieldTextColor != null
? widget.fieldTextColor
: Theme
.of(context)
.backgroundColor,
suffixIcon: _buildSuffixIcon(),
prefixIcon: widget.type != "search"
? widget.prefixIcon != null
@ -274,41 +304,62 @@ class _TextFieldsState extends State<TextFields> {
height: widget.borderOnlyError ? 0.0 : null),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context)
color: Theme
.of(context)
.errorColor
.withOpacity(widget.bare ? 0.0 : 0.5),
width: 2.0),
borderRadius: BorderRadius.circular(widget.bare ? 0.0 : 8.0)),
width: widget.borderWidth),
borderRadius: widget.bare
? BorderRadius.circular(0.0)
: widget.borderRadius != null
? widget.borderRadius
: BorderRadius.circular(widget.borderRadiusValue)),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context)
color: Theme
.of(context)
.errorColor
.withOpacity(widget.bare ? 0.0 : 0.5),
width: 2.0),
borderRadius: BorderRadius.circular(widget.bare ? 0.0 : 8.0)),
width: widget.borderWidth),
borderRadius: widget.bare
? BorderRadius.circular(0.0)
: widget.borderRadius != null
? widget.borderRadius
: BorderRadius.circular(widget.borderRadiusValue)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context)
color: Theme
.of(context)
.dividerColor
.withOpacity(widget.bare ? 0.0 : 1.0),
width: 2.0),
borderRadius: BorderRadius.circular(widget.bare ? 0.0 : 8.0)),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context)
width: widget.borderWidth),
borderRadius: widget.bare
? BorderRadius.circular(0.0)
: widget.borderRadius != null
? widget.borderRadius
: BorderRadius.circular(widget.borderRadiusValue)),
disabledBorder:
OutlineInputBorder(borderSide: BorderSide(color: Theme
.of(context)
.dividerColor
.withOpacity(widget.bare ? 0.0 : 1.0),
width: 2.0),
borderRadius: BorderRadius.circular(widget.bare ? 0.0 : 8.0)),
width: widget.borderWidth),
borderRadius: widget.bare ? BorderRadius.circular(0.0) : widget
.borderRadius != null ? widget.borderRadius : BorderRadius
.circular(widget.borderRadiusValue)),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context)
color: Theme
.of(context)
.dividerColor
.withOpacity(widget.bare ? 0.0 : 1.0),
width: 2.0),
borderRadius: BorderRadius.circular(widget.bare ? 0.0 : 8.0),
),
),
width: widget.borderWidth),
borderRadius: widget.bare
? BorderRadius.circular(0.0)
: widget.borderRadius != null
? widget.borderRadius
: BorderRadius.circular(widget.borderRadiusValue),
)),
),
));
}

@ -24,7 +24,8 @@ class AppScaffold extends StatelessWidget {
@override
Widget build(BuildContext context) {
AppGlobal.context = context;
return Scaffold(
return SafeArea(
child: Scaffold(
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
appBar: isShowAppBar
? AppBar(
@ -58,6 +59,7 @@ class AppScaffold extends StatelessWidget {
baseViewModel: baseViewModel,
)
: buildBodyWidget(),
),
);
}

@ -20,6 +20,8 @@ class NetworkBaseView extends StatelessWidget {
buildBaseViewWidget() {
switch (baseViewModel.state) {
case ViewState.Idle:
case ViewState.BusyLocal:
case ViewState.ErrorLocal:
return child;
break;
case ViewState.Busy:
@ -31,7 +33,6 @@ class NetworkBaseView extends StatelessWidget {
error: baseViewModel.error,
),
);
break;
}
}
}

@ -0,0 +1,84 @@
import 'package:flutter/material.dart';
class RoundedContainer extends StatefulWidget {
final double width;
final double height;
final double raduis;
final Color backgroundColor;
final double margin;
final double elevation;
final bool showBorder;
final Color borderColor;
final bool customCornerRaduis;
final double topLeft;
final double bottomRight;
final double topRight;
final double bottomLeft;
final Widget child;
final double borderWidth;
RoundedContainer(
{@required this.child,
this.width,
this.height,
this.raduis = 10,
this.backgroundColor = Colors.white,
this.margin = 10,
this.elevation = 1,
this.showBorder = false,
this.borderColor = Colors.red,
this.customCornerRaduis = false,
this.topLeft = 0,
this.topRight = 0,
this.bottomRight = 0,
this.bottomLeft = 0,
this.borderWidth = 1});
@override
_RoundedContainerState createState() => _RoundedContainerState();
}
class _RoundedContainerState extends State<RoundedContainer> {
@override
Widget build(BuildContext context) {
return Container(
width: widget.width,
height: widget.height,
margin: EdgeInsets.all(widget.margin),
decoration: widget.showBorder == true
? BoxDecoration(
color: Theme.of(context).primaryColor,
border: Border.all(
color: widget.borderColor, width: widget.borderWidth),
borderRadius: widget.customCornerRaduis
? BorderRadius.only(
topLeft: Radius.circular(widget.topLeft),
topRight: Radius.circular(widget.topRight),
bottomRight: Radius.circular(widget.bottomRight),
bottomLeft: Radius.circular(widget.bottomLeft))
: BorderRadius.circular(widget.raduis),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.1),
spreadRadius: 10,
blurRadius: 5,
offset: Offset(0, 5), // changes position of shadow
),
])
: null,
child: Card(
margin: EdgeInsets.all(0),
shape: RoundedRectangleBorder(
borderRadius: widget.customCornerRaduis
? BorderRadius.only(
topLeft: Radius.circular(widget.topLeft),
topRight: Radius.circular(widget.topRight),
bottomRight: Radius.circular(widget.bottomRight),
bottomLeft: Radius.circular(widget.bottomLeft))
: BorderRadius.circular(widget.raduis),
),
color: widget.backgroundColor,
child: widget.child,
));
}
}

@ -92,3 +92,7 @@ flutter:
- asset: assets/fonts/Work_Sans/WorkSans-Bold.ttf
- asset: assets/fonts/Work_Sans/WorkSans-Bold.ttf
weight: 700
- family: DriverApp
fonts:
- asset: lib/app-icons/fonts/DriverApp.ttf

Loading…
Cancel
Save