import ' dart:convert ' ;
import ' package:flutter/material.dart ' ;
import ' package:intl/intl.dart ' ;
import ' package:supplier_new/common/settings.dart ' ;
import ' package:supplier_new/orders/edit_order_requests.dart ' ;
import ' ../resources/tankers_model.dart ' ;
import ' best_options.dart ' ;
class AcceptOrderRequests extends StatefulWidget {
var order ;
var status ;
AcceptOrderRequests ( { this . order , this . status } ) ;
@ override
State < AcceptOrderRequests > createState ( ) = > _AcceptOrderRequestsState ( ) ;
}
class _AcceptOrderRequestsState extends State < AcceptOrderRequests > {
int advancePayable = 0 ;
double totalFare = 0.0 ;
final TextEditingController tankerPriceController = TextEditingController ( ) ;
double platformFee = 0.0 ;
double totalTaxes = 0.0 ;
double subtotal = 0.0 ;
double cgst = 0.0 ;
double sgst = 0.0 ;
double total = 0.0 ;
@ override
void initState ( ) {
// TODO: implement initState
super . initState ( ) ;
tankerPriceController . addListener ( ( ) = > setState ( ( ) { } ) ) ;
fetchTankers ( ) ;
platformFee = 11 ;
tankerPriceController . text = ' ${ widget . order . quoted_amount } ' ;
}
List < TankersModel > tankersList = [ ] ;
bool isLoadingTankers = false ;
Future < void > fetchTankers ( ) async {
setState ( ( ) {
isLoadingTankers = true ;
} ) ;
try {
final response =
await AppSettings . getTankers ( ) ;
final data =
( jsonDecode ( response ) [ ' data ' ] as List )
. map ( ( e ) = >
TankersModel . fromJson ( e ) )
. toList ( ) ;
tankersList = data ;
setState ( ( ) {
isLoadingTankers = false ;
} ) ;
}
catch ( e ) {
print ( e ) ;
setState ( ( ) {
isLoadingTankers = false ;
} ) ;
}
}
double getDeliveryFee ( ) {
if ( tankersList . isEmpty )
return 0 ;
String orderCapacity =
widget . order . capacity
. replaceAll ( " , " , " " )
. replaceAll ( " Litres " , " " )
. replaceAll ( " L " , " " )
. replaceAll ( " " , " " )
. trim ( ) ;
var matched =
tankersList . firstWhere (
( t ) {
String tankerCap =
t . capacity
. replaceAll ( " , " , " " )
. replaceAll ( " Litres " , " " )
. replaceAll ( " L " , " " )
. replaceAll ( " " , " " )
. trim ( ) ;
return tankerCap
= = orderCapacity ;
} ,
orElse: ( ) = > TankersModel ( ) ,
) ;
return double . tryParse (
matched . delivery_fee . toString ( )
) ? ? 0 ;
}
double calculateTransport ( ) {
double distance =
double . tryParse (
widget . order . distanceInKm
. toString ( )
) ? ? 0 ;
double deliveryFee =
getDeliveryFee ( ) ;
double qty =
double . tryParse (
widget . order . quantity
. toString ( )
) ? ? 1 ;
return ( distance *
deliveryFee *
qty ) ;
}
@ override
Widget build ( BuildContext context ) {
int tankerPrice = int . tryParse ( tankerPriceController . text ) ? ? 0 ;
int updatedQuantity = int . tryParse ( widget . order . quantity ) ? ? 0 ;
String updatedCapacity = widget . order . capacity ;
int bookingCharges =
calculateTransport ( ) . round ( ) ;
//int totalPrice = (tankerPrice * updatedQuantity) + bookingCharges;
int advancePayable = bookingCharges ; //
//int amountToPayAfterDelivery=totalPrice-bookingCharges;
double distance =
double . tryParse (
widget . order . distanceInKm . toString ( )
) ? ? 0 ;
double perKm =
getDeliveryFee ( ) ;
double transport =
calculateTransport ( ) ;
double actualPrice =
double . tryParse (
tankerPriceController . text
) ? ? 0 ;
double quantity =
double . tryParse (
widget . order . quantity . toString ( )
) ? ? 1 ;
double subtotal =
actualPrice * quantity ;
double cgst =
subtotal * 0.09 ;
double sgst =
subtotal * 0.09 ;
double totalTaxes =
cgst + sgst ;
double totalPrice =
subtotal +
transport +
totalTaxes +
platformFee ;
double amountToPayAfterDelivery =
totalPrice - transport ;
return Scaffold (
backgroundColor: Colors . white ,
extendBodyBehindAppBar: true ,
appBar: AppBar (
backgroundColor: Colors . transparent ,
elevation: 0 ,
scrolledUnderElevation: 0 ,
title: Text (
' ' ,
style: fontTextStyle ( 16 , Color ( 0XFF2A2A2A ) , FontWeight . w600 ) ,
) ,
iconTheme: IconThemeData ( color: Color ( 0XFF2A2A2A ) ) ,
actions: [
Row (
children: [
Padding (
padding: EdgeInsets . fromLTRB ( 0 , 10 , 10 , 10 ) ,
child: IconButton (
icon: Image . asset (
' images/help_appbar.png ' ,
height: 20 ,
width: 20 ,
color: Color ( 0XFFFFFFFF ) ,
) ,
onPressed: ( ) { } ,
) ,
)
] ,
)
] ,
leading: GestureDetector (
onTap: ( ) {
Navigator . pop ( context ) ;
} ,
child: Padding (
padding:
const EdgeInsets . fromLTRB ( 8 , 8 , 8 , 8 ) , // Add padding if needed
child: Image . asset (
' images/backbutton_appbar.png ' , // Replace with your image path
fit: BoxFit . contain ,
color: Color ( 0XFFFFFFFF ) ,
height: 24 ,
width: 24 ,
) ,
) ,
) ,
) ,
body: SingleChildScrollView (
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
/// 🔹 Top Card with Image
Stack (
clipBehavior: Clip . none ,
children: [
/// 🔹 Background Image
ClipRRect (
borderRadius: const BorderRadius . only (
bottomLeft: Radius . circular ( 0 ) ,
bottomRight: Radius . circular ( 0 ) ,
) ,
child: Image . asset (
" images/building.png " ,
height: 220 ,
width: double . infinity ,
fit: BoxFit . cover ,
) ,
) ,
/// 🔹 Floating Info Card (half on image, half below)
Positioned (
bottom: - 40 , // pulls the card out by 40px
left: 12 ,
right: 12 ,
child: Container (
padding: const EdgeInsets . all ( 12 ) ,
decoration: BoxDecoration (
color: Colors . white ,
borderRadius: BorderRadius . circular ( 12 ) ,
boxShadow: [
BoxShadow (
color: Colors . black12 ,
blurRadius: 6 ,
offset: Offset ( 0 , 3 ) ,
) ,
] ,
) ,
child: Row (
crossAxisAlignment: CrossAxisAlignment . center ,
children: [
Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
Container (
padding: const EdgeInsets . symmetric (
horizontal: 8 , vertical: 4 ) ,
decoration: BoxDecoration (
color: Color ( 0XFFFFFFFF ) ,
borderRadius: BorderRadius . circular ( 4 ) ,
border: Border . all (
color: widget . status . statusColor ,
width: 0.5 ,
) ,
) ,
child: Text ( widget . status . status ,
style: fontTextStyle (
12 ,
widget . status . statusColor ,
FontWeight . w500 ) ) ,
) ,
Text (
widget . order . building_name ,
style: fontTextStyle (
20 , const Color ( 0XFF2D2E30 ) , FontWeight . w600 ) ,
) ,
SizedBox ( height: 4 ) ,
Text (
widget . order . displayAddress ,
style: fontTextStyle (
12 , const Color ( 0XFF939495 ) , FontWeight . w400 ) ,
) ,
] ,
) ,
const Spacer ( ) ,
Text (
widget . order . distanceInKm . toString ( ) + ' Km ' ,
style: fontTextStyle (
12 , const Color ( 0XFF939495 ) , FontWeight . w400 ) ,
) ,
] ,
) ,
) ,
) ,
] ,
) ,
SizedBox (
height: MediaQuery . of ( context ) . size . height * . 08 ,
) ,
/// 🔹 Order Details
Padding (
padding: EdgeInsets . fromLTRB ( 16 , 0 , 16 , 0 ) ,
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
Text (
" ORDER DETAILS " ,
style: fontTextStyle (
10 , const Color ( 0XFF2D2E30 ) , FontWeight . w600 ) ,
) ,
SizedBox (
height: MediaQuery . of ( context ) . size . height * . 011 ,
) ,
_twoFields ( tankerPriceController , " Tanker Price " ,
' images/price.png ' , false , null , null , null , null ) ,
/ * _detailTwoRow (
" Tanker Price " ,
" ₹ ${ AppSettings . formDouble ( widget . order . quoted_amount ) ? ? ' ' } " ,
" images/financialsBottomIcon.png " ,
" " ,
" " ,
" " ) , * /
_detailTwoRow (
" Transport Charges " ,
" ₹ " +
AppSettings . formDouble (
transport . toString ( ) ) ,
" images/advance.png " ,
" " ,
" " ,
" " ,
) ,
Padding (
padding: EdgeInsets . only ( left: 4 ) ,
child: Row (
crossAxisAlignment: CrossAxisAlignment . start ,
mainAxisAlignment: MainAxisAlignment . start ,
children: [
Image . asset (
' images/warning.png ' ,
fit: BoxFit . cover ,
width:
22 , // Match the diameter of the CircleAvatar
height: 22 ,
) ,
SizedBox ( width: MediaQuery . of ( context ) . size . width * . 020 ) ,
Expanded (
child: Text (
" Transport charges are calculated based on distance ${ distance . toStringAsFixed ( 2 ) } km and rate ₹ ${ perKm . toStringAsFixed ( 0 ) } per km. Total transport charges are ₹ ${ transport . toStringAsFixed ( 0 ) } . " ,
softWrap: true ,
style: fontTextStyle (
11 ,
Color ( 0XFF646566 ) ,
FontWeight . w400 ) ,
) ,
) ,
] ,
)
) ,
_detailTwoRow (
" Water Type " ,
" ${ widget . order . type_of_water } " ,
" images/water.png " ,
" Date of Delivery " ,
" ${ widget . order . date } " ,
" images/calendar_appbar.png " ,
) ,
SizedBox (
height: MediaQuery . of ( context ) . size . height * . 02 ,
) ,
_detailTwoRow (
" Capacity " ,
" ${ widget . order . capacity } " ,
" images/capacity.png " ,
" Time of Delivery " ,
" ${ widget . order . averageTime } " ,
" images/time.png " ,
) ,
SizedBox (
height: MediaQuery . of ( context ) . size . height * . 02 ,
) ,
_detailTwoRow (
" Quantity " ,
" ${ widget . order . quantity } " ,
" images/quantity.png " ,
" " ,
" " ,
" " ,
) ,
] ,
) ,
) ,
SizedBox (
height: MediaQuery . of ( context ) . size . height * . 008 ,
) ,
/// 🔹 Additional Details
/ * Padding (
padding: EdgeInsets . fromLTRB ( 16 , 0 , 16 , 16 ) ,
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
Text (
" ADDITIONAL DETAILS " ,
style: fontTextStyle (
10 , const Color ( 0XFF2D2E30 ) , FontWeight . w600 ) ,
) ,
SizedBox (
height: MediaQuery . of ( context ) . size . height * . 011 ,
) ,
Text (
" Lorem ipsum dolor sit amet, consectetur adipiscing elit, "
" sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "
" Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut "
" aliquip ex ea commodo consequat. " ,
style: fontTextStyle (
12 , const Color ( 0XFF646566 ) , FontWeight . w400 ) ,
) ,
] ,
) ) , * /
/// 🔹 Payment Summary
/ * Padding (
padding: EdgeInsets . fromLTRB ( 16 , 0 , 16 , 16 ) ,
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
Text (
" PAYMENT SUMMARY " ,
style: fontTextStyle (
10 , const Color ( 0XFF2D2E30 ) , FontWeight . w600 ) ,
) ,
SizedBox (
height: MediaQuery . of ( context ) . size . height * . 011 ,
) ,
_detailRow ( " Tanker Price " ,
" ₹ ${ AppSettings . formDouble ( widget . order . quoted_amount ) ? ? ' ' } " ) ,
SizedBox (
height: MediaQuery . of ( context ) . size . height * . 004 ,
) ,
_detailRow ( " Booking Charges " , " ₹ " + advance . toString ( ) ) ,
SizedBox (
height: MediaQuery . of ( context ) . size . height * . 004 ,
) ,
_detailRow ( " Total Amount " , " ₹ " + totalFare . toString ( ) ) ,
SizedBox (
height: MediaQuery . of ( context ) . size . height * . 004 ,
) ,
Divider (
color: Color ( 0XFF646566 ) ,
thickness: 0.3 ,
) ,
SizedBox (
height: MediaQuery . of ( context ) . size . height * . 004 ,
) ,
_detailRow ( " Booking Charges Payable " ,
' ₹ ${ AppSettings . formDouble ( advancePayable . toString ( ) ) ? ? ' ' } ' ) ,
SizedBox (
height: MediaQuery . of ( context ) . size . height * . 004 ,
) ,
_detailRow ( " Amount to Pay (After Delivery) " ,
' ₹ ${ AppSettings . formDouble ( amountToPayAfterDelivery . toString ( ) ) ? ? ' ' } ' ) ,
] ,
) ,
) , * /
const SizedBox ( height: 20 ) ,
Padding ( padding: EdgeInsets . fromLTRB ( 16 , 0 , 16 , 16 ) ,
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
Text ( " UPDATED PAYMENT SUMMARY " ,
style: fontTextStyle ( 12 , Color ( 0XFF2D2E30 ) , FontWeight . w600 ) , ) ,
const SizedBox ( height: 12 ) ,
_summaryRow ( " Quantity " , " $ updatedQuantity " ) ,
_summaryRow ( " Capacity " , " $ updatedCapacity " ) ,
_summaryRow ( " Tanker Price " , " ₹ $ tankerPrice " ) ,
_summaryRow ( " Transport Charges " , " ₹ $ bookingCharges " ) ,
_summaryRow ( ' Platform Fee ' , ' ₹ ${ AppSettings . moneyConvertion ( platformFee . toString ( ) ) } ' ) ,
_summaryRow ( ' Taxes ' , ' ₹ ${ AppSettings . moneyConvertion ( totalTaxes . toString ( ) ) } ' ) ,
_summaryRow (
" Total Price " ,
" ₹ ${ AppSettings . formDouble ( totalPrice . toString ( ) ) } "
) ,
const Divider ( ) ,
_summaryRow (
" Transport Charges " ,
" ₹ ${ AppSettings . formDouble ( transport . toString ( ) ) } "
) ,
_summaryRow ( " Amount to Pay (After Delivery) " , " ₹ $ amountToPayAfterDelivery " ) ,
] ,
) ) ,
const SizedBox ( height: 80 ) , // space for bottom buttons
] ,
) ,
) ,
/// 🔹 Bottom Action Buttons
bottomNavigationBar: Container (
padding: const EdgeInsets . symmetric ( horizontal: 12 , vertical: 8 ) ,
decoration: BoxDecoration (
color: Color ( 0XFFFFFFFF ) ,
border: Border ( top: BorderSide ( color: Color ( 0XFFF5F6F6 ) ) ) ,
) ,
child: Row (
children: [
/ * Expanded (
child: OutlinedButton (
style: OutlinedButton . styleFrom (
foregroundColor: Color ( 0XFF000000 ) ,
backgroundColor: Color ( 0xFFF1F1F1 ) ,
side: BorderSide ( color: Color ( 0xFFF1F1F1 ) ) ,
padding:
EdgeInsets . symmetric ( vertical: 10 ) , // uniform height
) ,
onPressed: ( ) {
Navigator . push (
context ,
MaterialPageRoute (
builder: ( _ ) = > EditOrderRequests (
order: widget . order ,
advance: advance . toString ( ) ,
status: widget . status ,
) ,
) ,
) ;
} ,
child: Row (
mainAxisAlignment: MainAxisAlignment . center ,
children: [
Image . asset ( ' images/edit.png ' , height: 20 , width: 20 ) ,
SizedBox ( width: 4 ) ,
Text (
" Edit Order " ,
style: fontTextStyle (
14 , const Color ( 0XFF000000 ) , FontWeight . w400 ) ,
) ,
] ,
) ,
) ,
) ,
SizedBox ( width: 8 ) , * /
Expanded (
child: OutlinedButton (
style: OutlinedButton . styleFrom (
foregroundColor: Color ( 0XFFE2483D ) ,
backgroundColor: Colors . white ,
side: BorderSide ( color: Color ( 0XFFE2483D ) ) ,
padding: EdgeInsets . symmetric ( vertical: 10 ) ,
) ,
onPressed: ( ) async {
AppSettings . preLoaderDialog ( context ) ;
bool isOnline = await AppSettings . internetConnectivity ( ) ;
if ( isOnline ) {
var payload = new Map < String , dynamic > ( ) ;
payload [ " supplierId " ] = AppSettings . supplierId ;
payload [ " amount " ] = int . parse ( tankerPriceController . text ) ;
payload [ " delivery_charges " ] = calculateTransport ( ) . round ( ) ;
payload [ " action " ] = ' reject ' ;
bool status = await AppSettings . acceptOrderRequests (
payload , widget . order . dbId ) ;
try {
if ( status ) {
Navigator . of ( context , rootNavigator: true ) . pop ( ) ;
AppSettings . longSuccessToast ( " Order request rejected Successfully " ) ;
Navigator . pop ( context , true ) ;
}
else {
Navigator . of ( context , rootNavigator: true ) . pop ( ) ;
AppSettings . longFailedToast ( " reject of order request Failed " ) ;
}
} catch ( e ) {
Navigator . of ( context , rootNavigator: true ) . pop ( ) ;
print ( e ) ;
}
}
else {
Navigator . of ( context , rootNavigator: true ) . pop ( ) ;
AppSettings . longFailedToast ( " Please Check internet " ) ;
}
} ,
child: Row (
mainAxisAlignment: MainAxisAlignment . center ,
children: [
Image . asset ( ' images/cross.png ' , height: 20 , width: 20 ) ,
SizedBox ( width: 4 ) ,
Text (
" Reject " ,
style: fontTextStyle (
14 , const Color ( 0XFF000000 ) , FontWeight . w400 ) ,
) ,
] ,
) ,
) ,
) ,
SizedBox ( width: 8 ) ,
Expanded (
child: ElevatedButton (
style: ElevatedButton . styleFrom (
backgroundColor: Color ( 0XFF0A9E04 ) ,
foregroundColor: Color ( 0XFFFFFFFF ) ,
padding: EdgeInsets . symmetric ( vertical: 10 ) ,
) ,
onPressed: ( ) async {
AppSettings . preLoaderDialog ( context ) ;
bool isOnline = await AppSettings . internetConnectivity ( ) ;
if ( isOnline ) {
var payload = new Map < String , dynamic > ( ) ;
payload [ " supplierId " ] = AppSettings . supplierId ;
payload [ " amount " ] = int . parse ( tankerPriceController . text ) ;
payload [ " delivery_charges " ] = calculateTransport ( ) . round ( ) ;
payload [ " action " ] = ' accept ' ;
bool status = await AppSettings . acceptOrderRequests (
payload , widget . order . dbId ) ;
try {
if ( status ) {
Navigator . of ( context , rootNavigator: true ) . pop ( ) ;
Navigator . pop ( context , true ) ;
}
else {
Navigator . of ( context , rootNavigator: true ) . pop ( ) ;
AppSettings . longFailedToast ( " Accept of order request Failed " ) ;
}
} catch ( e ) {
Navigator . of ( context , rootNavigator: true ) . pop ( ) ;
print ( e ) ;
}
}
else {
Navigator . of ( context , rootNavigator: true ) . pop ( ) ;
AppSettings . longFailedToast ( " Please Check internet " ) ;
}
} ,
/ * onPressed: ( ) {
Navigator . push (
context ,
MaterialPageRoute (
builder: ( _ ) = > TankerOptionsDemo ( )
)
) ;
} , * /
child: Row (
mainAxisAlignment: MainAxisAlignment . center ,
children: [
Image . asset ( ' images/rite.png ' , height: 20 , width: 20 ) ,
SizedBox ( width: 4 ) ,
Text (
" Accept " ,
style: fontTextStyle (
14 , const Color ( 0XFFFFFFFF ) , FontWeight . w400 ) ,
) ,
] ,
) ,
) ,
) ,
] ,
) ) ,
) ;
}
/// 🔹 Helper widget for rows
Widget _detailRow ( String title , String value ) {
return Padding (
padding: const EdgeInsets . symmetric ( vertical: 0 ) ,
child: Row (
mainAxisAlignment: MainAxisAlignment . spaceBetween ,
children: [
Text (
title ,
style: fontTextStyle ( 12 , const Color ( 0XFF646566 ) , FontWeight . w400 ) ,
) ,
Text (
value ,
style: fontTextStyle ( 12 , const Color ( 0XFF2D2E30 ) , FontWeight . w500 ) ,
) ,
] ,
) ,
) ;
}
Widget _twoFields (
TextEditingController ? controller1 ,
String ? label1 ,
String ? path1 ,
bool ? readOnly1 ,
TextEditingController ? controller2 ,
String ? label2 ,
String ? path2 ,
bool ? readOnly2 ) {
return Row (
children: [
Expanded (
child: _textField ( controller1 , label1 , path1 , readOnly1 ! ) ,
) ,
const SizedBox ( width: 10 ) ,
if ( controller2 ! = null )
Expanded (
child: _textField ( controller2 , label2 , path2 , readOnly2 ! ) ,
) ,
] ,
) ;
}
Widget _textField ( TextEditingController ? controller , String ? label ,
String ? path , bool readOnly ) {
return Container (
margin: const EdgeInsets . only ( bottom: 12 ) ,
child: TextField (
controller: controller ,
cursorColor: primaryColor ,
readOnly: readOnly ,
decoration: InputDecoration (
counterText: ' ' ,
filled: false ,
fillColor: Colors . white ,
prefixIcon: Padding (
padding: const EdgeInsets . symmetric ( horizontal: 6.0 , vertical: 6.0 ) ,
child: SizedBox (
width: 18 ,
height: 18 ,
child: Image . asset (
path ! ,
fit: BoxFit . contain ,
color: Color ( 0XFFC3C4C4 ) ,
) ,
) ,
) ,
prefixIconConstraints: BoxConstraints (
minWidth: 24 ,
minHeight: 24 ,
) ,
suffixIcon: readOnly
? null
: Padding (
padding: const EdgeInsets . only ( right: 8 ) ,
child: Image . asset (
' images/edit.png ' ,
height: 18 ,
width: 18 ,
color: const Color ( 0XFFC3C4C4 ) ,
) ,
) ,
suffixIconConstraints: BoxConstraints (
minWidth: 24 ,
minHeight: 24 ,
) ,
border: OutlineInputBorder (
borderRadius: BorderRadius . circular ( 4.0 ) ,
borderSide: BorderSide (
color: Color ( 0XFFC3C4C4 ) ,
width: 1 ,
) ) ,
focusedBorder: ! readOnly
? OutlineInputBorder (
borderRadius: BorderRadius . circular ( 4.0 ) ,
borderSide: BorderSide (
color: Color ( 0XFF8270DB ) ,
width: 1 ,
) ,
)
: OutlineInputBorder (
borderRadius: BorderRadius . circular ( 4.0 ) ,
borderSide: BorderSide (
color: Color ( 0XFFC3C4C4 ) ,
width: 1 ,
) ,
) ,
enabledBorder: OutlineInputBorder (
borderRadius: BorderRadius . circular ( 4.0 ) ,
borderSide: BorderSide ( color: Color ( 0XFFC3C4C4 ) ) ,
) ,
labelText: label ,
labelStyle: fontTextStyle ( 12 , Color ( 0XFF646566 ) , FontWeight . w400 ) ,
/ * TextStyle ( color: greyColor , fontWeight: FontWeight . bold //<-- SEE HERE
) , * /
) ,
style: fontTextStyle ( 12 , Color ( 0XFF343637 ) , FontWeight . w500 ) ,
) ,
) ;
}
Widget _summaryRow ( String title , String value ) {
return Padding (
padding: const EdgeInsets . symmetric ( vertical: 6 ) ,
child: Row (
mainAxisAlignment: MainAxisAlignment . spaceBetween ,
children: [
Text ( title , style: fontTextStyle ( 12 , Color ( 0XFF646566 ) , FontWeight . w400 ) , ) ,
Text ( value ,
style: fontTextStyle ( 12 , Color ( 0XFF2D2E30 ) , FontWeight . w500 ) , ) ,
] ,
) ,
) ;
}
Widget _detailTwoRow (
String title1 ,
String value1 ,
String path1 ,
String title2 ,
String value2 ,
String path2 , {
EdgeInsetsGeometry padding = const EdgeInsets . symmetric ( vertical: 6 ) ,
} ) {
final titleStyle = fontTextStyle ( 12 , Color ( 0XFF646566 ) , FontWeight . w400 ) ;
final valueStyle = fontTextStyle ( 12 , Color ( 0XFF343637 ) , FontWeight . w500 ) ;
Widget _col ( String t , String v , String path ) {
return Expanded (
child: Padding (
padding: const EdgeInsets . only ( right: 8.0 ) ,
child: Row (
crossAxisAlignment: CrossAxisAlignment . center ,
children: [
if ( path . isNotEmpty )
Image . asset (
path ,
fit: BoxFit . contain ,
height: 20 ,
width: 20 ,
color: const Color ( 0XFFC3C4C4 ) ,
) ,
if ( path . isNotEmpty ) const SizedBox ( width: 6 ) ,
Expanded (
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
Text ( t ,
style: titleStyle ,
maxLines: 1 ,
overflow: TextOverflow . ellipsis ) ,
Text ( v ,
style: valueStyle ,
maxLines: 1 ,
overflow: TextOverflow . ellipsis ) ,
] ,
) ,
)
] ,
) ,
) ,
) ;
}
return Padding (
padding: padding ,
child: Row (
mainAxisAlignment: MainAxisAlignment . spaceBetween ,
children: [
_col ( title1 , value1 , path1 ) ,
_col ( title2 , value2 , path2 ) ,
] ,
) ,
) ;
}
}