refacto: new Balance and Certifications Widgets

This commit is contained in:
poka 2022-12-06 04:33:10 +01:00
parent 4ef5f77888
commit 150f6892f8
17 changed files with 249 additions and 204 deletions

View File

@ -11,9 +11,10 @@ import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/wallet_view.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:gecko/widgets/wallet_name.dart';
import 'package:gecko/widgets/wallet_name_controller.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart';
@ -164,14 +165,12 @@ class DuniterIndexer with ChangeNotifier {
Color color = Colors.black,
FontWeight fontWeight = FontWeight.w400,
FontStyle fontStyle = FontStyle.italic]) {
final walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
if (indexerEndpoint == '') {
if (wallet == null) {
return const SizedBox();
} else {
if (canEdit) {
return walletOptions.walletName(context, wallet, size, color);
return WalletName(wallet: wallet, size: size, color: color);
} else {
return WalletNameController(wallet: wallet, size: size);
}
@ -223,7 +222,7 @@ class DuniterIndexer with ChangeNotifier {
return const SizedBox();
} else {
if (canEdit) {
return walletOptions.walletName(context, wallet, size, color);
return WalletName(wallet: wallet, size: size, color: color);
} else {
return WalletNameController(wallet: wallet, size: size);
}
@ -326,7 +325,8 @@ class DuniterIndexer with ChangeNotifier {
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
balance(context, profile['pubkey'], 16),
Balance(
address: profile['pubkey'], size: 16),
]),
]),
),

View File

@ -68,9 +68,11 @@ class HomeProvider with ChangeNotifier {
Future changeCurrencyUnit(BuildContext context) async {
final sub = Provider.of<SubstrateSdk>(context, listen: false);
final walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
final bool isUdUnit = configBox.get('isUdUnit') ?? false;
await configBox.put('isUdUnit', !isUdUnit);
balanceCache = {};
walletOptions.balanceCache = {};
sub.getBalanceRatio();
notifyListeners();
}

View File

@ -17,7 +17,6 @@ import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:image_picker/image_picker.dart';
import 'package:provider/provider.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:truncate/truncate.dart';
class WalletOptionsProvider with ChangeNotifier {
TextEditingController address = TextEditingController();
@ -31,6 +30,7 @@ class WalletOptionsProvider with ChangeNotifier {
late bool isDefaultWallet;
bool canValidateNameBool = false;
Future<NewWallet>? get badWallet => null;
Map<String, double> balanceCache = {};
int getPinLenght(walletNbr) {
return pinLength;
@ -391,135 +391,33 @@ class WalletOptionsProvider with ChangeNotifier {
return addressGet;
}
Widget walletName(BuildContext context, WalletData wallet,
[double size = 20, Color color = Colors.black]) {
double newSize = wallet.name!.length <= 15 ? size : size - 2;
return Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
Text(
truncate(wallet.name!, 20),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: isTall ? newSize : newSize * 0.9,
color: color,
fontWeight: FontWeight.w400,
fontStyle: FontStyle.italic,
),
softWrap: false,
overflow: TextOverflow.ellipsis,
),
]);
Widget udUnitDisplay(double size, [Color color = Colors.black]) {
final bool isUdUnit = configBox.get('isUdUnit') ?? false;
return isUdUnit
? Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(
'ud'.tr(args: ['']),
style: TextStyle(
fontSize: isTall ? size : size * 0.9, color: color),
),
Column(
children: [
Text(
currencyName,
style: TextStyle(
fontSize: (isTall ? size : size * 0.9) * 0.7,
fontWeight: FontWeight.w500,
color: color),
),
const SizedBox(height: 15)
],
)
],
)
: Text(currencyName,
style:
TextStyle(fontSize: isTall ? size : size * 0.9, color: color));
}
}
Map<String, double> balanceCache = {};
Widget balance(BuildContext context, String address, double size,
[Color color = Colors.black,
Color loadingColor = const Color(0xffd07316)]) {
return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
return FutureBuilder(
future: sdk.getBalance(address),
builder: (BuildContext context,
AsyncSnapshot<Map<String, double>> globalBalance) {
if (globalBalance.connectionState != ConnectionState.done ||
globalBalance.hasError) {
if (balanceCache[address] != null &&
balanceCache[address] != -1) {
return Row(children: [
Text(balanceCache[address]!.toString(),
style: TextStyle(
fontSize: isTall ? size : size * 0.9, color: color)),
const SizedBox(width: 5),
udUnitDisplay(size, color),
]);
} else {
return SizedBox(
height: 15,
width: 15,
child: CircularProgressIndicator(
color: loadingColor,
strokeWidth: 2,
),
);
}
}
balanceCache[address] = globalBalance.data!['transferableBalance']!;
if (balanceCache[address] != -1) {
return Row(children: [
Text(
balanceCache[address]!.toString(),
style: TextStyle(
fontSize: isTall ? size : size * 0.9,
color: color,
),
),
const SizedBox(width: 5),
udUnitDisplay(size, color),
]);
} else {
return const Text('');
}
});
}),
]);
}
Widget getCerts(BuildContext context, String address, double size,
[Color color = Colors.black]) {
return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
return FutureBuilder(
future: sdk.getCertsCounter(address),
builder: (BuildContext context, AsyncSnapshot<List<int>> certs) {
// log.d(_certs.data);
return certs.data?[0] != 0 && certs.data != null
? Row(
children: [
Image.asset('assets/medal.png', height: 20),
const SizedBox(width: 1),
Text(certs.data?[0].toString() ?? '0',
style: const TextStyle(fontSize: 20)),
const SizedBox(width: 5),
Text(
"(${certs.data?[1].toString() ?? '0'})",
style: const TextStyle(fontSize: 14),
)
],
)
: const Text('');
});
}),
]);
}
Widget udUnitDisplay(double size, [Color color = Colors.black]) {
final bool isUdUnit = configBox.get('isUdUnit') ?? false;
return isUdUnit
? Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(
'ud'.tr(args: ['']),
style:
TextStyle(fontSize: isTall ? size : size * 0.9, color: color),
),
Column(
children: [
Text(
currencyName,
style: TextStyle(
fontSize: (isTall ? size : size * 0.9) * 0.7,
fontWeight: FontWeight.w500,
color: color),
),
const SizedBox(height: 15)
],
)
],
)
: Text(currencyName,
style: TextStyle(fontSize: isTall ? size : size * 0.9, color: color));
}

View File

@ -14,7 +14,7 @@ import 'package:gecko/providers/wallets_profiles.dart';
import 'package:flutter/material.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/screens/animated_text.dart';
import 'package:gecko/widgets/animated_text.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/myWallets/restore_chest.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';

View File

@ -10,8 +10,8 @@ import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:provider/provider.dart';
// import 'package:gecko/models/home.dart';
// import 'package:provider/provider.dart';
@ -222,8 +222,10 @@ class ChooseWalletScreen extends StatelessWidget {
// style: TextStyle(color: isDefault ? Colors.white : Colors.black),
// ),
Row(mainAxisAlignment: MainAxisAlignment.center, children: [
balance(
context, address, 16, isDefault ? Colors.white : Colors.black),
Balance(
address: address,
size: 16,
color: isDefault ? Colors.white : Colors.black),
])
]),
),

View File

@ -11,10 +11,10 @@ import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:gecko/widgets/certifications.dart';
import 'package:gecko/widgets/idty_status.dart';
import 'package:provider/provider.dart';
@ -214,7 +214,7 @@ class ImportG1v1 extends StatelessWidget {
isOwner: false,
color: Colors.black),
const SizedBox(width: 10),
getCerts(context, sub.g1V1NewAddress, 14)
Certifications(address: sub.g1V1NewAddress, size: 14)
],
),
const SizedBox(height: 30),

View File

@ -17,6 +17,8 @@ import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/activity.dart';
import 'package:gecko/screens/myWallets/manage_membership.dart';
import 'package:gecko/screens/qrcode_fullscreen.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:gecko/widgets/certifications.dart';
import 'package:gecko/widgets/idty_status.dart';
import 'package:gecko/widgets/page_route_no_transition.dart';
import 'package:provider/provider.dart';
@ -143,8 +145,9 @@ class WalletOptions extends StatelessWidget {
// SizedBox(height: isTall ? 5 : 0),
SizedBox(height: isTall ? 5 : 0),
balance(
context, walletProvider.address.text, 21),
Balance(
address: walletProvider.address.text,
size: 21),
const SizedBox(width: 30),
InkWell(
@ -174,8 +177,10 @@ class WalletOptions extends StatelessWidget {
address: walletOptions.address.text,
isOwner: true,
color: orangeC),
getCerts(context,
walletProvider.address.text, 15),
Certifications(
address:
walletProvider.address.text,
size: 15)
]),
),
@ -550,15 +555,15 @@ class WalletOptions extends StatelessWidget {
walletOptions.reload();
}
Widget deleteWallet(BuildContext context,
WalletOptionsProvider walletProvider, int currentChest) {
Widget deleteWallet(BuildContext context, WalletOptionsProvider walletOptions,
int currentChest) {
final sub = Provider.of<SubstrateSdk>(context, listen: false);
final myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
final defaultWallet = myWalletProvider.getDefaultWallet();
final bool isDefaultWallet =
walletProvider.address.text == defaultWallet.address;
walletOptions.address.text == defaultWallet.address;
// return Consumer<MyWalletsProvider>(
// builder: (context, _myWalletProvider, _) {
return FutureBuilder(
@ -569,7 +574,7 @@ class WalletOptions extends StatelessWidget {
return const Text('');
}
final double balance =
balanceCache[walletProvider.address.text] ?? -1;
walletOptions.balanceCache[walletOptions.address.text] ?? -1;
final bool canDelete = !isDefaultWallet &&
!hasConsumers.data! &&
(balance > 2 || balance == 0);
@ -577,7 +582,7 @@ class WalletOptions extends StatelessWidget {
key: keyDeleteWallet,
onTap: canDelete
? () async {
await walletProvider.deleteWallet(context, wallet);
await walletOptions.deleteWallet(context, wallet);
WidgetsBinding.instance.addPostFrameCallback((_) {
myWalletProvider.listWallets =
myWalletProvider.readAllWallets(currentChest);

View File

@ -22,6 +22,7 @@ import 'package:gecko/screens/myWallets/import_g1_v1.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/myWallets/wallet_options.dart';
import 'package:gecko/screens/wallet_view.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:provider/provider.dart';
import 'package:flutter_svg/flutter_svg.dart';
@ -392,12 +393,11 @@ class WalletsHome extends StatelessWidget {
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
balance(
context,
address,
15,
isDefault ? Colors.white : Colors.black,
isDefault ? yellowC : orangeC)
Balance(
address: address,
size: 15,
color: isDefault ? Colors.white : Colors.black,
loadingColor: isDefault ? yellowC : orangeC),
],
)),
);

View File

@ -8,10 +8,10 @@ import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/wallet_view.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:provider/provider.dart';
class ContactsScreen extends StatelessWidget {
@ -92,8 +92,10 @@ class ContactsScreen extends StatelessWidget {
mainAxisAlignment:
MainAxisAlignment.center,
children: [
balance(context,
g1Wallet.address, 16),
Balance(
address:
g1Wallet.address,
size: 16),
]),
]),
),

View File

@ -8,11 +8,11 @@ import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/providers/search.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/wallet_view.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:provider/provider.dart';
class SearchResultScreen extends StatelessWidget {
@ -115,10 +115,10 @@ class SearchResultScreen extends StatelessWidget {
MainAxisAlignment
.center,
children: [
balance(
context,
g1Wallet.address,
16),
Balance(
address: g1Wallet
.address,
size: 16),
]),
]),
),

View File

@ -11,9 +11,9 @@ import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/activity.dart';
import 'package:gecko/screens/common_elements.dart';
@ -21,6 +21,7 @@ import 'package:gecko/screens/myWallets/choose_wallet.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/qrcode_fullscreen.dart';
import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:gecko/widgets/header_profile.dart';
import 'package:gecko/widgets/page_route_no_transition.dart';
import 'package:provider/provider.dart';
@ -469,16 +470,19 @@ void paymentPopup(BuildContext context, String toAddress) {
context: context,
builder: (BuildContext context) {
final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
final walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
double fees = 0;
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
if (walletViewProvider.payAmount.text != '' &&
(double.parse(walletViewProvider.payAmount.text) +
2 / balanceRatio) <=
(balanceCache[defaultWallet.address] ?? 0) &&
(walletOptions.balanceCache[defaultWallet.address] ?? 0) &&
toAddress != defaultWallet.address) {
if ((balanceCache[toAddress] == 0 ||
balanceCache[toAddress] == null) &&
if ((walletOptions.balanceCache[toAddress] == 0 ||
walletOptions.balanceCache[toAddress] == null) &&
double.parse(walletViewProvider.payAmount.text) <
5 / balanceRatio) {
canValidate = false;
@ -573,7 +577,8 @@ void paymentPopup(BuildContext context, String toAddress) {
child: Row(children: [
Text(defaultWallet.name!),
const Spacer(),
balance(context, defaultWallet.address!, 20)
Balance(
address: defaultWallet.address!, size: 20),
]),
),
);

74
lib/widgets/balance.dart Normal file
View File

@ -0,0 +1,74 @@
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:provider/provider.dart';
class Balance extends StatelessWidget {
const Balance(
{Key? key,
required this.address,
required this.size,
this.color = Colors.black,
this.loadingColor = const Color(0xffd07316)})
: super(key: key);
final String address;
final double size;
final Color color;
final Color loadingColor;
@override
Widget build(BuildContext context) {
final walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
return FutureBuilder(
future: sdk.getBalance(address),
builder: (BuildContext context,
AsyncSnapshot<Map<String, double>> globalBalance) {
if (globalBalance.connectionState != ConnectionState.done ||
globalBalance.hasError) {
if (walletOptions.balanceCache[address] != null &&
walletOptions.balanceCache[address] != -1) {
return Row(children: [
Text(walletOptions.balanceCache[address]!.toString(),
style: TextStyle(
fontSize: isTall ? size : size * 0.9,
color: color)),
const SizedBox(width: 5),
walletOptions.udUnitDisplay(size, color),
]);
} else {
return SizedBox(
height: 15,
width: 15,
child: CircularProgressIndicator(
color: loadingColor,
strokeWidth: 2,
),
);
}
}
walletOptions.balanceCache[address] =
globalBalance.data!['transferableBalance']!;
if (walletOptions.balanceCache[address] != -1) {
return Row(children: [
Text(
walletOptions.balanceCache[address]!.toString(),
style: TextStyle(
fontSize: isTall ? size : size * 0.9,
color: color,
),
),
const SizedBox(width: 5),
walletOptions.udUnitDisplay(size, color),
]);
} else {
return const Text('');
}
});
}),
]);
}
}

View File

@ -0,0 +1,44 @@
import 'package:flutter/material.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:provider/provider.dart';
class Certifications extends StatelessWidget {
const Certifications(
{Key? key,
required this.address,
required this.size,
this.color = Colors.black})
: super(key: key);
final String address;
final double size;
final Color color;
@override
Widget build(BuildContext context) {
return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
return FutureBuilder(
future: sdk.getCertsCounter(address),
builder: (BuildContext context, AsyncSnapshot<List<int>> certs) {
// log.d(_certs.data);
return certs.data?[0] != 0 && certs.data != null
? Row(
children: [
Image.asset('assets/medal.png', height: 20),
const SizedBox(width: 1),
Text(certs.data?[0].toString() ?? '0',
style: const TextStyle(fontSize: 20)),
const SizedBox(width: 5),
Text(
"(${certs.data?[1].toString() ?? '0'})",
style: const TextStyle(fontSize: 14),
)
],
)
: const Text('');
});
}),
]);
}
}

View File

@ -9,6 +9,8 @@ import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/certifications.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:gecko/widgets/certifications.dart';
import 'package:gecko/widgets/idty_status.dart';
import 'package:gecko/widgets/page_route_no_transition.dart';
import 'package:provider/provider.dart';
@ -27,11 +29,12 @@ class HeaderProfile extends StatelessWidget {
Widget build(BuildContext context) {
const double avatarSize = 140;
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
final walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
return Stack(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sub, _) {
// sub.getBlockchainStart();
bool isAccountExist = balanceCache[address] != 0;
bool isAccountExist = walletOptions.balanceCache[address] != 0;
return Container(
height: 180,
decoration: BoxDecoration(
@ -53,7 +56,7 @@ class HeaderProfile extends StatelessWidget {
children: <Widget>[
Container(
height: 10,
color: yellowC, // Colors.grey[400],
color: yellowC,
),
Row(children: [
GestureDetector(
@ -72,9 +75,8 @@ class HeaderProfile extends StatelessWidget {
),
]),
const SizedBox(height: 25),
balance(context, address, 22),
Balance(address: address, size: 22),
const SizedBox(height: 10),
InkWell(
onTap: () => duniterIndexer.walletNameIndexer[address] != null
? {
@ -96,41 +98,16 @@ class HeaderProfile extends StatelessWidget {
address: address,
isOwner: false,
color: Colors.black),
getCerts(context, address, 14)
Certifications(address: address, size: 14)
],
),
),
// if (username == null &&
// g1WalletsBox.get(address)?.username != null)
// SizedBox(
// width: 230,
// child: Text(
// g1WalletsBox.get(address)?.username ?? '',
// style: const TextStyle(
// fontSize: 27,
// color: Color(0xff814C00),
// ),
// ),
// ),
// if (username != null)
// SizedBox(
// width: 230,
// child: Text(
// username,
// style: const TextStyle(
// fontSize: 27,
// color: Color(0xff814C00),
// ),
// ),
// ),
// const SizedBox(height: 55),
]),
const Spacer(),
Column(children: <Widget>[
ClipOval(
child: defaultAvatar(avatarSize),
),
// const SizedBox(height: 25),
]),
]),
),

View File

@ -2,7 +2,7 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/animated_text.dart';
import 'package:gecko/widgets/animated_text.dart';
import 'package:provider/provider.dart';
class IdentityStatus extends StatelessWidget {

View File

@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:truncate/truncate.dart';
class WalletName extends StatelessWidget {
const WalletName(
{Key? key,
required this.wallet,
this.size = 20,
this.color = Colors.black})
: super(key: key);
final WalletData wallet;
final double size;
final Color color;
@override
Widget build(BuildContext context) {
double newSize = wallet.name!.length <= 15 ? size : size - 2;
return Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
Text(
truncate(wallet.name!, 20),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: isTall ? newSize : newSize * 0.9,
color: color,
fontWeight: FontWeight.w400,
fontStyle: FontStyle.italic,
),
softWrap: false,
overflow: TextOverflow.ellipsis,
),
]);
}
}