Skip to content
Snippets Groups Projects
Commit 98c33439 authored by poka's avatar poka
Browse files

fix: make transactions working again

parent 87666627
No related branches found
No related tags found
No related merge requests found
Pipeline #38437 waiting for manual action
......@@ -214,6 +214,7 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> {
chest: configBox.get('currentChest'),
address: address,
number: 0,
derivation: -1,
name: 'currentWallet'.tr(),
imageDefaultPath: '0.png',
isOwned: true);
......
......@@ -41,22 +41,16 @@ class _TransactionInProgressState extends State<TransactionInProgress> {
@override
void initState() {
final walletProfiles =
Provider.of<WalletsProfilesProvider>(homeContext, listen: false);
final myWalletProvider =
Provider.of<MyWalletsProvider>(homeContext, listen: false);
final walletProfiles = Provider.of<WalletsProfilesProvider>(homeContext, listen: false);
final myWalletProvider = Provider.of<MyWalletsProvider>(homeContext, listen: false);
String defaultWalletAddress = myWalletProvider.getDefaultWallet().address;
String defaultWalletName = myWalletProvider.getDefaultWallet().name!;
String? walletDataName =
myWalletProvider.getWalletDataByAddress(widget.toAddress ?? '')?.name;
String? walletDataName = myWalletProvider.getWalletDataByAddress(widget.toAddress ?? '')?.name;
fromAddressFormat = widget.fromAddress ??
g1WalletsBox.get(defaultWalletAddress)?.username ??
defaultWalletName;
fromAddressFormat = widget.fromAddress ?? g1WalletsBox.get(defaultWalletAddress)?.username ?? defaultWalletName;
toAddressFormat = widget.toAddress ?? walletProfiles.address;
toUsernameFormat =
widget.toUsername ?? walletDataName ?? getShortPubkey(toAddressFormat);
toUsernameFormat = widget.toUsername ?? walletDataName ?? getShortPubkey(toAddressFormat);
amount = walletProfiles.payAmount.text;
isUdUnit = configBox.get('isUdUnit') ?? false;
......@@ -94,13 +88,11 @@ class _TransactionInProgressState extends State<TransactionInProgress> {
}
if (txContent!.status == TransactionStatus.success) {
resultText = 'extrinsicValidated'
.tr(args: [actionMap[widget.transType] ?? 'strangeTransaction'.tr()]);
resultText = 'extrinsicValidated'.tr(args: [actionMap[widget.transType] ?? 'strangeTransaction'.tr()]);
} else if (txContent!.status == TransactionStatus.failed) {
resultText = errorTransactionMap[txContent!.error] ?? txContent!.error!;
} else {
resultText = statusStatusMap[txContent!.status] ??
'Unknown status: ${txContent!.status}';
resultText = statusStatusMap[txContent!.status] ?? 'Unknown status: ${txContent!.status}';
}
Widget buildTransactionStatus() {
......@@ -125,13 +117,9 @@ class _TransactionInProgressState extends State<TransactionInProgress> {
toolbarHeight: scaleSize(57),
elevation: 0,
automaticallyImplyLeading: false,
title: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
title: Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
Text(
'extrinsicInProgress'.tr(args: [
actionMap[widget.transType] ?? 'strangeTransaction'.tr()
]),
'extrinsicInProgress'.tr(args: [actionMap[widget.transType] ?? 'strangeTransaction'.tr()]),
style: scaledTextStyle(fontSize: 19),
)
])),
......@@ -154,12 +142,9 @@ class _TransactionInProgressState extends State<TransactionInProgress> {
ScaledSizedBox(height: 10),
if (widget.transType == 'pay')
Text(
isUdUnit
? 'ud'.tr(args: ['$amount '])
: '$amount $currencyName',
isUdUnit ? 'ud'.tr(args: ['$amount ']) : '$amount $currencyName',
textAlign: TextAlign.center,
style: scaledTextStyle(
fontSize: 16, fontWeight: FontWeight.w500),
style: scaledTextStyle(fontSize: 16, fontWeight: FontWeight.w500),
),
if (widget.transType == 'pay') ScaledSizedBox(height: 10),
Text(
......@@ -170,8 +155,7 @@ class _TransactionInProgressState extends State<TransactionInProgress> {
Text(
fromAddressFormat,
textAlign: TextAlign.center,
style: scaledTextStyle(
fontSize: 16, fontWeight: FontWeight.w500),
style: scaledTextStyle(fontSize: 16, fontWeight: FontWeight.w500),
),
Visibility(
visible: fromAddressFormat != toAddressFormat,
......@@ -186,8 +170,7 @@ class _TransactionInProgressState extends State<TransactionInProgress> {
Text(
toUsernameFormat,
textAlign: TextAlign.center,
style: scaledTextStyle(
fontSize: 16, fontWeight: FontWeight.w500),
style: scaledTextStyle(fontSize: 16, fontWeight: FontWeight.w500),
),
],
),
......@@ -216,8 +199,7 @@ class _TransactionInProgressState extends State<TransactionInProgress> {
},
child: Text(
'close'.tr(),
style: scaledTextStyle(
fontSize: 18, fontWeight: FontWeight.w600),
style: scaledTextStyle(fontSize: 18, fontWeight: FontWeight.w600),
),
),
),
......
......@@ -20,7 +20,7 @@ class HistoryQuery extends StatelessWidget {
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
final sub = Provider.of<SubstrateSdk>(context, listen: false);
final ScrollController scrollController = ScrollController();
final scrollController = ScrollController();
FetchMoreOptions? opts;
int nRepositories = 20;
......@@ -46,11 +46,7 @@ class HistoryQuery extends StatelessWidget {
Query(
options: QueryOptions(
document: gql(getHistoryByAddressRelayQ),
variables: <String, dynamic>{
'address': address,
'first': nRepositories,
'after': null
},
variables: <String, dynamic>{'address': address, 'first': nRepositories, 'after': null},
),
builder: (QueryResult result, {fetchMore, refetch}) {
duniterIndexer.refetch = refetch;
......@@ -61,8 +57,7 @@ class HistoryQuery extends StatelessWidget {
),
);
}
final List transactions =
result.data?["transferConnection"]["edges"];
final List transactions = result.data?["transferConnection"]["edges"];
// Get transaction in progress if exist
String? transactionId;
......@@ -78,9 +73,7 @@ class HistoryQuery extends StatelessWidget {
return Column(children: <Widget>[
Column(
children: [
if (transactionId != null)
TransactionInProgressTule(
address: address, transactionId: transactionId),
if (transactionId != null) TransactionInProgressTule(address: address, transactionId: transactionId),
ScaledSizedBox(height: 50),
Text(
"noNetworkNoHistory".tr(),
......@@ -94,9 +87,7 @@ class HistoryQuery extends StatelessWidget {
return Column(children: <Widget>[
Column(
children: [
if (transactionId != null)
TransactionInProgressTule(
address: address, transactionId: transactionId),
if (transactionId != null) TransactionInProgressTule(address: address, transactionId: transactionId),
ScaledSizedBox(height: 50),
Text(
"noDataToDisplay".tr(),
......@@ -108,8 +99,7 @@ class HistoryQuery extends StatelessWidget {
}
if (result.isNotLoading) {
opts = duniterIndexer.mergeQueryResult(
result, opts, address, nRepositories);
opts = duniterIndexer.mergeQueryResult(result, opts, address, nRepositories);
}
// Build history list
......@@ -123,10 +113,7 @@ class HistoryQuery extends StatelessWidget {
key: keyListTransactions,
controller: scrollController,
children: <Widget>[
if (transactionId != null)
TransactionInProgressTule(
address: address,
transactionId: transactionId),
if (transactionId != null) TransactionInProgressTule(address: address, transactionId: transactionId),
HistoryView(
result: result,
address: address,
......@@ -142,8 +129,7 @@ class HistoryQuery extends StatelessWidget {
}
if (t is ScrollEndNotification &&
scrollController.position.pixels >=
scrollController.position.maxScrollExtent * 0.7 &&
scrollController.position.pixels >= scrollController.position.maxScrollExtent * 0.7 &&
duniterIndexer.pageInfo!['hasNextPage'] &&
result.isNotLoading) {
fetchMore!(opts!);
......
......@@ -18,10 +18,8 @@ import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
void paymentPopup(BuildContext context, String toAddress, String? username) {
final walletViewProvider =
Provider.of<WalletsProfilesProvider>(context, listen: false);
final myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
final walletViewProvider = Provider.of<WalletsProfilesProvider>(context, listen: false);
final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
double fees = 0;
const double shapeSize = 20;
......@@ -37,12 +35,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
// Payment workflow !
final sub = Provider.of<SubstrateSdk>(context, listen: false);
final acc = sub.getCurrentWallet();
// log.d(
// "fromAddress: ${acc.address!},destAddress: $toAddress, amount: ${double.parse(walletViewProvider.payAmount.text)}");
// final transactionId = await sub.pay(
// fromAddress: acc.address!, destAddress: toAddress, amount: double.parse(walletViewProvider.payAmount.text), password: myWalletProvider.pinCode);
// TransactionInProgress(transactionId: transactionId, toAddress: toAddress, toUsername: username);
sub.pay(fromAddress: acc.address!, destAddress: toAddress, amount: double.parse(walletViewProvider.payAmount.text), password: myWalletProvider.pinCode);
Navigator.push(
context,
......@@ -57,18 +51,15 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
if (payAmount.isEmpty) {
return false;
}
final walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
final defaultWalletBalance =
walletOptions.balanceCache[defaultWallet.address] ?? 0;
final walletOptions = Provider.of<WalletOptionsProvider>(context, listen: false);
final defaultWalletBalance = walletOptions.balanceCache[defaultWallet.address] ?? 0;
const existentialDeposit = 2;
final double payAmountValue = double.parse(payAmount);
final double toAddressBalance = walletOptions.balanceCache[toAddress] ?? 0;
// Prevent sending more than the balance with existential deposit
if (payAmountValue / balanceRatio >
defaultWalletBalance - existentialDeposit) {
if (payAmountValue / balanceRatio > defaultWalletBalance - existentialDeposit) {
return false;
}
......@@ -78,16 +69,14 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
}
// Prevent sending to an empty wallet with less than 2 (existential deposit)
if (toAddressBalance == 0 &&
payAmountValue < existentialDeposit / balanceRatio) {
if (toAddressBalance == 0 && payAmountValue < existentialDeposit / balanceRatio) {
return false;
}
return true;
}
myWalletProvider.readAllWallets().then((value) => myWalletProvider.listWallets
.sort((a, b) => a.derivation!.compareTo(b.derivation!)));
myWalletProvider.readAllWallets().then((value) => myWalletProvider.listWallets.sort((a, b) => (a.derivation ?? -1).compareTo(b.derivation ?? -1)));
showModalBottomSheet<void>(
shape: const RoundedRectangleBorder(
......@@ -101,13 +90,11 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
builder: (BuildContext context) {
final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
canValidate = canValidatePayment();
final bool isUdUnit = configBox.get('isUdUnit') ?? false;
return Padding(
padding: EdgeInsets.only(
bottom: MediaQuery.of(context).viewInsets.bottom),
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
child: Container(
height: scaleSize(400),
decoration: const ShapeDecoration(
......@@ -120,22 +107,12 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
),
),
child: Padding(
padding: EdgeInsets.only(
top: scaleSize(14),
bottom: 0,
left: scaleSize(16),
right: scaleSize(16)),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
padding: EdgeInsets.only(top: scaleSize(14), bottom: 0, left: scaleSize(16), right: scaleSize(16)),
child: Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
Text(
'executeATransfer'.tr(),
style: scaledTextStyle(
fontSize: 18, fontWeight: FontWeight.w700),
style: scaledTextStyle(fontSize: 18, fontWeight: FontWeight.w700),
),
IconButton(
key: keyPopButton,
......@@ -149,19 +126,14 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
ScaledSizedBox(height: 5),
Text(
'from'.tr(args: ['']),
style: scaledTextStyle(
fontSize: 15,
fontWeight: FontWeight.w500,
color: Colors.grey[600]),
style: scaledTextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: Colors.grey[600]),
),
ScaledSizedBox(height: 5),
Consumer<SubstrateSdk>(builder: (context, sub, _) {
return Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.blueAccent.shade200, width: 2),
borderRadius:
const BorderRadius.all(Radius.circular(10)),
border: Border.all(color: Colors.blueAccent.shade200, width: 2),
borderRadius: const BorderRadius.all(Radius.circular(10)),
),
alignment: Alignment.center,
padding: const EdgeInsets.all(0),
......@@ -172,22 +144,16 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
value: defaultWallet,
menuMaxHeight: scaleSize(270),
onTap: () {
FocusScope.of(context)
.requestFocus(amountFocus);
FocusScope.of(context).requestFocus(amountFocus);
},
selectedItemBuilder: (_) {
return myWalletProvider.listWallets
.map((WalletData wallet) {
return myWalletProvider.listWallets.map((WalletData wallet) {
return Container(
width: scaleSize(isTall ? 315 : 310),
padding: EdgeInsets.all(scaleSize(7)),
child: Visibility(
visible: wallet.address ==
defaultWallet.address,
child: Row(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
visible: wallet.address == defaultWallet.address,
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
NameByAddress(
wallet: wallet,
fontStyle: FontStyle.normal,
......@@ -195,9 +161,7 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
),
const Spacer(),
// const Text('data')
Balance(
address: wallet.address,
size: 18),
Balance(address: wallet.address, size: 18),
]),
),
);
......@@ -210,8 +174,7 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
amountFocus.requestFocus();
setState(() {});
},
items: myWalletProvider.listWallets
.map((WalletData wallet) {
items: myWalletProvider.listWallets.map((WalletData wallet) {
return DropdownMenuItem(
value: wallet,
key: keySelectThisWallet(wallet.address),
......@@ -219,19 +182,14 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
color: const Color(0xffffeed1),
width: scaleSize(isTall ? 315 : 310),
padding: const EdgeInsets.all(10),
child: Row(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
NameByAddress(
wallet: wallet,
fontStyle: FontStyle.normal,
size: 18,
),
const Spacer(),
Balance(
address: wallet.address,
size: 18),
Balance(address: wallet.address, size: 18),
]),
),
);
......@@ -243,10 +201,7 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
children: [
Text(
'to'.tr(args: ['']),
style: scaledTextStyle(
fontSize: 15,
fontWeight: FontWeight.w500,
color: Colors.grey[600]),
style: scaledTextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: Colors.grey[600]),
),
ScaledSizedBox(width: 10),
Text(
......@@ -263,22 +218,17 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
children: [
Text(
'amount'.tr(),
style: scaledTextStyle(
fontSize: 15,
fontWeight: FontWeight.w500,
color: Colors.grey[600]),
style: scaledTextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: Colors.grey[600]),
),
const Spacer(),
InkWell(
onTap: () => infoFeesPopup(context),
child: Row(
children: [
Icon(Icons.info_outlined,
color: orangeC, size: scaleSize(21)),
Icon(Icons.info_outlined, color: orangeC, size: scaleSize(21)),
ScaledSizedBox(width: 5),
Text(
'fees'.tr(
args: [fees.toString(), currencyName]),
'fees'.tr(args: [fees.toString(), currencyName]),
style: scaledTextStyle(
color: orangeC,
fontSize: 13,
......@@ -300,8 +250,7 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
},
child: TextField(
textInputAction: TextInputAction.done,
onEditingComplete: () async =>
canValidate ? await executeTransfert() : null,
onEditingComplete: () async => canValidate ? await executeTransfert() : null,
key: keyAmountField,
controller: walletViewProvider.payAmount,
autofocus: true,
......@@ -309,33 +258,23 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
maxLines: 1,
textAlign: TextAlign.center,
autocorrect: false,
keyboardType: const TextInputType.numberWithOptions(
decimal: true),
keyboardType: const TextInputType.numberWithOptions(decimal: true),
onChanged: (_) async {
fees = await sub.txFees(
defaultWallet.address,
toAddress,
double.parse(
walletViewProvider.payAmount.text == ''
? '0'
: walletViewProvider.payAmount.text));
defaultWallet.address, toAddress, double.parse(walletViewProvider.payAmount.text == '' ? '0' : walletViewProvider.payAmount.text));
setState(() {});
},
inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.deny(',',
replacementString: '.'),
FilteringTextInputFormatter.allow(
RegExp(r'(^\d+\.?\d{0,2})')),
FilteringTextInputFormatter.deny(',', replacementString: '.'),
FilteringTextInputFormatter.allow(RegExp(r'(^\d+\.?\d{0,2})')),
],
decoration: InputDecoration(
hintText: '0.00',
suffix: Text(
isUdUnit ? 'ud'.tr(args: ['']) : currencyName),
suffix: Text(isUdUnit ? 'ud'.tr(args: ['']) : currencyName),
filled: true,
fillColor: Colors.transparent,
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Colors.grey[500]!, width: 2),
borderSide: BorderSide(color: Colors.grey[500]!, width: 2),
borderRadius: BorderRadius.circular(8),
),
contentPadding: EdgeInsets.all(scaleSize(9)),
......@@ -366,8 +305,7 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
: null,
child: Text(
'executeTheTransfer'.tr(),
style: scaledTextStyle(
fontSize: 17, fontWeight: FontWeight.w600),
style: scaledTextStyle(fontSize: 17, fontWeight: FontWeight.w600),
),
),
),
......
......@@ -15,15 +15,13 @@ import 'package:provider/provider.dart';
import 'package:fade_and_translate/fade_and_translate.dart';
class TransactionInProgressTule extends StatefulWidget {
const TransactionInProgressTule(
{super.key, required this.address, this.transactionId});
const TransactionInProgressTule({super.key, required this.address, this.transactionId});
final String address;
final String? transactionId;
@override
State<TransactionInProgressTule> createState() =>
_TransactionInProgressTuleState();
State<TransactionInProgressTule> createState() => _TransactionInProgressTuleState();
}
class _TransactionInProgressTuleState extends State<TransactionInProgressTule> {
......@@ -38,7 +36,7 @@ class _TransactionInProgressTuleState extends State<TransactionInProgressTule> {
final stream = duniterIndexer.subscribeHistoryIssued(widget.address);
txContent = sub.transactionStatus[widget.transactionId]!;
//TODO: change way to get finliized transaction status
//TODO: change way to get finalized transaction status
subscription = stream.listen((result) {
if (result.data?['accountConnection']['edges'] == null) return;
......@@ -46,8 +44,7 @@ class _TransactionInProgressTuleState extends State<TransactionInProgressTule> {
log.e(result.exception);
isVisible = true;
} else {
final Map transDataNode =
result.data?['accountConnection']['edges'].first;
final Map transDataNode = result.data?['accountConnection']['edges'].first;
if (transDataNode['node']['transfersIssued'].isEmpty) return;
final Map transData = transDataNode['node']['transfersIssued'][0];
final String receiver = transData['toId'];
......@@ -55,9 +52,7 @@ class _TransactionInProgressTuleState extends State<TransactionInProgressTule> {
final createdAt = DateTime.parse(transData['timestamp']);
final difference = createdAt.difference(DateTime.now());
if (receiver == txContent.to &&
amount == txContent.amount &&
difference.inSeconds.abs() < 30) {
if (receiver == txContent.to && amount == txContent.amount && difference.inSeconds.abs() < 30) {
isVisible = false;
txContent.status = TransactionStatus.finalized;
sub.reload();
......@@ -75,8 +70,7 @@ class _TransactionInProgressTuleState extends State<TransactionInProgressTule> {
Widget build(BuildContext context) {
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
final statusIcon =
TransactionStatusIcon(txContent.status, size: 21, stroke: 2);
final statusIcon = TransactionStatusIcon(txContent.status, size: 21, stroke: 2);
String humanStatus = '';
final finalAmount = txContent.amount * -1;
......@@ -85,8 +79,7 @@ class _TransactionInProgressTuleState extends State<TransactionInProgressTule> {
} else if (txContent.status == TransactionStatus.failed) {
humanStatus = errorTransactionMap[txContent.error] ?? txContent.error!;
} else {
humanStatus = statusStatusMap[txContent.status] ??
'Unknown status: ${txContent.status}';
humanStatus = statusStatusMap[txContent.status] ?? 'Unknown status: ${txContent.status}';
}
return FadeAndTranslate(
......@@ -111,21 +104,15 @@ class _TransactionInProgressTuleState extends State<TransactionInProgressTule> {
const SizedBox(height: 10),
Text(
'Transaction en cours',
style: scaledTextStyle(
fontSize: 19,
color: Colors.blueAccent,
fontWeight: FontWeight.w400),
style: scaledTextStyle(fontSize: 19, color: Colors.blueAccent, fontWeight: FontWeight.w400),
),
ListTile(
key: const Key('transactionInProgress'),
contentPadding:
const EdgeInsets.symmetric(horizontal: 5, vertical: 15),
contentPadding: const EdgeInsets.symmetric(horizontal: 5, vertical: 15),
leading: DatapodAvatar(address: txContent.to, size: 50),
title: Padding(
padding: const EdgeInsets.only(bottom: 5),
child: Text(getShortPubkey(txContent.to),
style: scaledTextStyle(
fontSize: 16, fontFamily: 'Monospace')),
child: Text(getShortPubkey(txContent.to), style: scaledTextStyle(fontSize: 16, fontFamily: 'Monospace')),
),
subtitle: Row(
children: [
......@@ -135,23 +122,13 @@ class _TransactionInProgressTuleState extends State<TransactionInProgressTule> {
width: 170,
child: Text(
humanStatus,
style: scaledTextStyle(
fontStyle: FontStyle.italic,
color: Theme.of(context)
.textTheme
.titleLarge!
.color,
fontSize: 13),
style: scaledTextStyle(fontStyle: FontStyle.italic, color: Theme.of(context).textTheme.titleLarge!.color, fontSize: 13),
),
),
],
),
trailing: Text("$finalAmount $currencyName",
style: scaledTextStyle(
fontSize: 15,
fontWeight: FontWeight.w500,
color: Colors.blue[700]),
textAlign: TextAlign.justify),
style: scaledTextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: Colors.blue[700]), textAlign: TextAlign.justify),
dense: !isTall,
isThreeLine: false),
],
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment