Improve token image display with mask and background (#3231)

* Improve token image display with mask and background * Enhance token image bg and remove wierd halo effect that was showing, also add token bg to disclaimer and picker * Add token bg to more locations and give another shot at halo * fix: halo around token images * add token background to non-transparent images only * another shot at bg based on transparency * refactor: enhance token image widget shape handling and add filter quality option to cake image widget * fix: another shot

David Adegoke committed Jun 3, 2026 at 13:10 UTC 43654622790ed3b32444385732877c0100ca94ae
14 files changed +257 -116
lib/new-ui/pages/swap_page.dart
+5 -2
@@ -8,6 +8,7 @@ import 'package:cake_wallet/exchange/exchange_trade_state.dart';
8 import 'package:cake_wallet/exchange/provider/chainflip_exchange_provider.dart';
9 import 'package:cake_wallet/exchange/provider/thorchain_exchange.provider.dart';
10 import 'package:cake_wallet/generated/i18n.dart';
11 +import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart';
12 import 'package:cake_wallet/new-ui/widgets/keyboard_hide_overlay.dart';
13 import 'package:cake_wallet/new-ui/widgets/modern_button.dart';
14 import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
@@ -969,8 +970,10 @@ class SwapAmountBoxState extends State<SwapAmountBox> {
970 child: Row(
971 mainAxisAlignment: MainAxisAlignment.center,
972 children: [
972 - CakeImageWidget(imageUrl: _selectedCurrency.iconPath ?? "",
973 - width: 28, height: 28),
973 + TokenImageWidget(
974 + imageUrl: _selectedCurrency.iconPath ?? "",
975 + size: 28,
976 + ),
977 SizedBox(width: 10),
978 Text(
979 currencyToShow,
lib/new-ui/widgets/coins_page/assets_history/asset_details_modal.dart
+5 -1
@@ -6,6 +6,7 @@ import 'package:cake_wallet/new-ui/pages/bridge/bridge_amount_page.dart';
6 import 'package:cake_wallet/new-ui/pages/receive_page.dart';
7 import 'package:cake_wallet/new-ui/pages/send_page.dart';
8 import 'package:cake_wallet/new-ui/pages/swap_page.dart';
9 +import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart';
10 import 'package:cake_wallet/new-ui/widgets/modern_button.dart';
11 import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
12 import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
@@ -77,7 +78,10 @@ class AssetDetailsModal extends StatelessWidget {
78 child: Stack(
79 children: [
80 if (iconPath.isNotEmpty)
80 - CakeImageWidget(imageUrl: iconPath, width: 75, height: 75)
81 + TokenImageWidget(
82 + imageUrl: iconPath,
83 + size: 75,
84 + )
85 else
86 Container(
87 width: 75,
lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart
+23 -41
@@ -1,8 +1,8 @@
1 import 'dart:math' show min;
2
3 import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/asset_details_modal.dart';
4 +import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart';
5 import 'package:cake_wallet/src/screens/wallet_connect/utils/string_parsing.dart';
5 -import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
6 import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart';
7 import 'package:cw_core/crypto_currency.dart';
8 import 'package:cw_core/wallet_base.dart';
@@ -83,47 +83,29 @@ class AssetTile extends StatelessWidget {
83 child: Row(
84 mainAxisSize: MainAxisSize.min,
85 children: [
86 - Container(
87 - width: 36,
88 - height: 36,
89 - child: Stack(
90 - children: [
91 - if((iconPath).isNotEmpty)
92 - CakeImageWidget(imageUrl: iconPath)
93 - else
94 - Container(
95 - width: 36,
96 - height: 36,
97 - decoration: BoxDecoration(
98 - color: Theme.of(context).colorScheme.primary,
99 - borderRadius: BorderRadius.circular(99999)),
100 - child: Center(
101 - child: Text(
102 - balance.asset.name.substring(0, min(2, balance.asset.name.length)),
103 - style: TextStyle(
104 - fontSize: 20, color: Theme.of(context).colorScheme.onPrimary),
105 - )),
86 + iconPath.isNotEmpty
87 + ? TokenImageWidget(
88 + imageUrl: iconPath,
89 + size: 36,
90 + )
91 + : Container(
92 + width: 36,
93 + height: 36,
94 + decoration: BoxDecoration(
95 + color: Theme.of(context).colorScheme.primary,
96 + shape: BoxShape.circle,
97 + ),
98 + child: Center(
99 + child: Text(
100 + balance.asset.name
101 + .substring(0, min(2, balance.asset.name.length)),
102 + style: TextStyle(
103 + fontSize: 20,
104 + color: Theme.of(context).colorScheme.onPrimary,
105 + ),
106 ),
107 - // if (chainIconPath.isNotEmpty)
108 - // Align(
109 - // alignment: Alignment.bottomRight,
110 - // child: Container(
111 - // decoration: ShapeDecoration(
112 - // shape: RoundedSuperellipseBorder(
113 - // borderRadius: BorderRadius.circular(5),side: BorderSide(color: Colors.black)),
114 - // color: Colors.white),
115 - // child: Padding(
116 - // padding: const EdgeInsets.all(2.0),
117 - // child: CakeImageWidget(
118 - // imageUrl: chainIconPath,
119 - // width: 12,
120 - // height: 12,
121 - // colorFilter:
122 - // ColorFilter.mode(Colors.black, BlendMode.srcIn),
123 - // ),
124 - // )))
125 - ],
126 - )),
107 + ),
108 + ),
109 SizedBox(width: 12.0),
110 Expanded(
111 child: Column(
lib/new-ui/widgets/coins_page/assets_history/history_tile.dart
+14 -13
@@ -1,4 +1,5 @@
1 import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/history_tile_base.dart';
2 +import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart';
3 import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
4 import 'package:cw_core/crypto_currency.dart';
5 import 'package:cw_core/transaction_direction.dart';
@@ -77,22 +78,20 @@ class HistoryTile extends StatelessWidget {
78 child: Container(
79 width: 16,
80 height: 16,
80 - decoration: BoxDecoration(color: Theme.of(context).colorScheme.onInverseSurface, shape: BoxShape.circle),
81 - child: CakeImageWidget(imageUrl:
82 - _getDirectionIconToken(),
81 + decoration: BoxDecoration(
82 + color: Theme.of(context).colorScheme.onInverseSurface, shape: BoxShape.circle),
83 + child: CakeImageWidget(
84 + imageUrl: _getDirectionIconToken(),
85 + height: 14,
86 + width: 14,
87 colorFilter: ColorFilter.mode(
88 direction == TransactionDirection.outgoing
85 - ? Theme
86 - .of(context)
87 - .colorScheme
88 - .inverseSurface.withAlpha(175)
89 + ? Theme.of(context).colorScheme.inverseSurface.withAlpha(175)
90 : Colors.green,
91 BlendMode.srcIn),
91 - width: 14,
92 - height: 14,
93 - ),
92 + ),
93 ),
95 - )
94 + )
95 ],
96 );
97 }
@@ -101,8 +100,10 @@ class HistoryTile extends StatelessWidget {
100 return Stack(children: [
101 Opacity(
102 opacity: pending ? 0.5 : 1,
104 - child: CakeImageWidget(imageUrl: asset?.iconPath ??"", width: 34,
105 - height: 34,),
103 + child: CakeImageWidget(
104 + imageUrl: asset?.iconPath ?? "",
105 + width: 34,
106 + ),
107 ),
108 Align(
109 alignment: Alignment.bottomRight,
lib/new-ui/widgets/coins_page/assets_history/transaction_details_modal.dart
+7 -6
@@ -1,13 +1,13 @@
1 import 'package:cake_wallet/entities/new_ui_entities/list_item/list_item.dart';
2 import 'package:cake_wallet/entities/new_ui_entities/list_item/list_item_regular_row.dart';
3 import 'package:cake_wallet/generated/i18n.dart';
4 +import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart';
5 import 'package:cake_wallet/new-ui/widgets/copy_wrapper.dart';
6 import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
7 import 'package:cake_wallet/routes.dart';
8 import 'package:cake_wallet/src/screens/transaction_details/confirmations_list_item.dart';
9 import 'package:cake_wallet/src/screens/transaction_details/transaction_details_list_item.dart';
10 import 'package:cake_wallet/src/screens/transaction_details/address_list_item.dart';
10 -import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
11 import 'package:cake_wallet/src/widgets/new_list_row/new_list_section.dart';
12 import 'package:cake_wallet/utils/address_formatter.dart';
13 import 'package:cake_wallet/view_model/transaction_details_view_model.dart';
@@ -71,11 +71,12 @@ class _TransactionDetailsModalState extends State<TransactionDetailsModal> {
71 controller: controller,
72 child: Column(
73 children: [
74 - CakeImageWidget(
75 - imageUrl: widget.transactionDetailsViewModel.transactionAsset.iconPath ??
76 - "",
77 - width: 64,
78 - height: 64),
74 + TokenImageWidget(
75 + imageUrl: widget
76 + .transactionDetailsViewModel.transactionAsset.iconPath ??
77 + "",
78 + size: 64,
79 + ),
80 SizedBox(height: 10),
81 Text(
82 widget.transactionDetailsViewModel.formattedTitle +
lib/new-ui/widgets/coins_page/token_image_widget.dart new
+156
@@ -0,0 +1,156 @@
1 +import 'dart:async';
2 +import 'dart:ui' as ui;
3 +
4 +import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
5 +import 'package:cw_core/utils/print_verbose.dart';
6 +import 'package:flutter/material.dart';
7 +
8 +enum _IconShape {
9 + alreadyCircular,
10 + clipOnly,
11 + hollowNeedsBackdrop,
12 +}
13 +
14 +class TokenImageWidget extends StatefulWidget {
15 + const TokenImageWidget({
16 + super.key,
17 + required this.imageUrl,
18 + required this.size,
19 + this.errorWidget,
20 + });
21 +
22 + final String imageUrl;
23 + final double size;
24 + final Widget? errorWidget;
25 +
26 + @override
27 + State<TokenImageWidget> createState() => _TokenImageWidgetState();
28 +}
29 +
30 +class _TokenImageWidgetState extends State<TokenImageWidget> {
31 + static final Map<String, _IconShape> _shapeCache = {};
32 +
33 + _IconShape _shape = _IconShape.clipOnly;
34 +
35 + @override
36 + void initState() {
37 + super.initState();
38 + _resolveShape();
39 + }
40 +
41 + @override
42 + void didUpdateWidget(TokenImageWidget oldWidget) {
43 + super.didUpdateWidget(oldWidget);
44 + if (oldWidget.imageUrl != widget.imageUrl) {
45 + _resolveShape();
46 + }
47 + }
48 +
49 + Future<void> _resolveShape() async {
50 + final url = widget.imageUrl;
51 +
52 + final cached = _shapeCache[url];
53 + if (cached != null) {
54 + if (mounted && _shape != cached) {
55 + setState(() => _shape = cached);
56 + }
57 + return;
58 + }
59 +
60 + final shape = await _analyzeShape(url);
61 + _shapeCache[url] = shape;
62 + if (mounted) {
63 + setState(() => _shape = shape);
64 + }
65 + }
66 +
67 + Future<_IconShape> _analyzeShape(String url) async {
68 + if (url.toLowerCase().endsWith('.svg')) return _IconShape.clipOnly;
69 +
70 + final ImageProvider provider;
71 + if (url.startsWith('assets/')) {
72 + provider = AssetImage(url);
73 + } else if (url.startsWith('http')) {
74 + provider = NetworkImage(url);
75 + } else {
76 + return _IconShape.clipOnly;
77 + }
78 +
79 + try {
80 + final completer = Completer<ui.Image>();
81 + final stream = provider.resolve(ImageConfiguration.empty);
82 + late final ImageStreamListener listener;
83 + listener = ImageStreamListener(
84 + (info, _) {
85 + if (!completer.isCompleted) completer.complete(info.image);
86 + },
87 + onError: (error, _) {
88 + if (!completer.isCompleted) completer.completeError(error);
89 + },
90 + );
91 + stream.addListener(listener);
92 +
93 + final image = await completer.future;
94 + stream.removeListener(listener);
95 +
96 + final byteData = await image.toByteData(format: ui.ImageByteFormat.rawRgba);
97 + if (byteData == null) return _IconShape.clipOnly;
98 +
99 + final totalPixels = image.width * image.height;
100 + var transparentPixels = 0;
101 + for (var i = 0; i < totalPixels; i++) {
102 + final alpha = byteData.getUint8(i * 4 + 3);
103 + if (alpha < 128) transparentPixels++;
104 + }
105 +
106 + final ratio = transparentPixels / totalPixels;
107 +
108 + if (ratio > 0.15 && ratio < 0.30) {
109 + return _IconShape.alreadyCircular;
110 + }
111 +
112 + if (ratio >= 0.30) {
113 + return _IconShape.hollowNeedsBackdrop;
114 + }
115 +
116 + return _IconShape.clipOnly;
117 + } catch (e) {
118 + printV('TokenImageWidget: failed to analyze $url: $e');
119 + return _IconShape.clipOnly;
120 + }
121 + }
122 +
123 + @override
124 + Widget build(BuildContext context) {
125 + final image = SizedBox(
126 + width: widget.size,
127 + height: widget.size,
128 + child: CakeImageWidget(
129 + imageUrl: widget.imageUrl,
130 + width: widget.size,
131 + height: widget.size,
132 + fit: BoxFit.cover,
133 + filterQuality: FilterQuality.high,
134 + errorWidget: widget.errorWidget,
135 + ),
136 + );
137 +
138 + switch (_shape) {
139 + case _IconShape.alreadyCircular:
140 + return image;
141 + case _IconShape.clipOnly:
142 + return ClipOval(child: image);
143 + case _IconShape.hollowNeedsBackdrop:
144 + return Container(
145 + width: widget.size,
146 + height: widget.size,
147 + clipBehavior: Clip.antiAlias,
148 + decoration: const BoxDecoration(
149 + shape: BoxShape.circle,
150 + color: Colors.white,
151 + ),
152 + child: image,
153 + );
154 + }
155 + }
156 +}
lib/new-ui/widgets/receive_page/receive_amount_modal.dart
+9 -8
@@ -1,5 +1,6 @@
1 import 'package:cake_wallet/entities/fiat_currency.dart';
2 import 'package:cake_wallet/generated/i18n.dart';
3 +import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart';
4 import 'package:cake_wallet/new-ui/widgets/new_primary_button.dart';
5 import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
6 import 'package:cake_wallet/src/screens/exchange/widgets/currency_picker.dart';
@@ -84,14 +85,14 @@ class _ReceiveAmountModalState extends State<ReceiveAmountModal> {
85 Row(
86 spacing: 8,
87 children: [
87 - Image.asset(
88 - widget.walletAddressListViewModel.tokenCurrency
89 - ?.iconPath ??
90 - widget.walletAddressListViewModel.currencies.first
91 - .iconPath ??
92 - "",
93 - width: 32,
94 - height: 32),
88 + TokenImageWidget(
89 + imageUrl: widget.walletAddressListViewModel.tokenCurrency
90 + ?.iconPath ??
91 + widget.walletAddressListViewModel.currencies.first
92 + .iconPath ??
93 + "",
94 + size: 32,
95 + ),
96 Text((widget.walletAddressListViewModel.tokenCurrency ??
97 widget.walletAddressListViewModel.currencies.first
98 as CryptoCurrency)
lib/new-ui/widgets/receive_page/receive_info_box.dart
+4 -4
@@ -2,6 +2,7 @@ import 'dart:math';
2
3 import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart';
4 import 'package:cake_wallet/generated/i18n.dart';
5 +import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart';
6 import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
7 import 'package:cw_core/crypto_currency.dart';
8 import 'package:cw_core/wallet_type.dart';
@@ -177,10 +178,9 @@ class InfoboxCurrencyRow extends StatelessWidget {
178 color: Theme.of(context).colorScheme.surfaceContainer,
179 width: iconBorder),
180 borderRadius: BorderRadius.circular(9999999)),
180 - child: CakeImageWidget(
181 - imageUrl: entry.value.iconPath,
182 - width: 24,
183 - height: 24,
181 + child: TokenImageWidget(
182 + imageUrl: entry.value.iconPath ?? '',
183 + size: 24,
184 ),
185 ),
186 ))
lib/new-ui/widgets/send_page/send_amount_input.dart
+2 -1
@@ -1,3 +1,4 @@
1 +import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart';
2 import 'package:cake_wallet/new-ui/widgets/send_page/floating_icon_button.dart';
3 import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
4 import 'package:flutter/material.dart';
@@ -109,7 +110,7 @@ class _NewSendAmountInputState extends State<NewSendAmountInput> {
110 spacing: 8,
111 children: [
112 if (widget.hasPicker && widget.currencyIconPath.isNotEmpty)
112 - CakeImageWidget(imageUrl: widget.currencyIconPath, width: 24, height: 24),
113 + TokenImageWidget(imageUrl: widget.currencyIconPath, size: 24),
114 Text(widget.currency),
115 if (widget.hasPicker)
116 CakeImageWidget(imageUrl:
lib/src/screens/dashboard/edit_token_page.dart
+3 -3
@@ -1,5 +1,6 @@
1 import 'package:cake_wallet/core/address_validator.dart';
2 import 'package:cake_wallet/generated/i18n.dart';
3 +import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart';
4 import 'package:cake_wallet/src/screens/base_page.dart';
5 import 'package:cake_wallet/src/widgets/address_text_field.dart';
6 import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
@@ -396,10 +397,9 @@ class _EditTokenPageBodyState extends State<EditTokenPageBody> {
397 alignment: Alignment.center,
398 children: [
399 ClipOval(
399 - child: CakeImageWidget(
400 + child: TokenImageWidget(
401 imageUrl: _tokenIconPathController.text,
401 - width: 75,
402 - height: 75,
402 + size: 75,
403 ),
404 ),
405 if (_isTokenVerified)
lib/src/screens/dashboard/home_settings_page.dart
+18 -26
@@ -5,14 +5,11 @@ import 'package:cake_wallet/entities/new_ui_entities/list_item/list_item_regular
5 import 'package:cake_wallet/entities/new_ui_entities/list_item/list_item_toggle.dart';
6 import 'package:cake_wallet/entities/sort_balance_types.dart';
7 import 'package:cake_wallet/generated/i18n.dart';
8 -import 'package:cake_wallet/new-ui/pages/settings_page.dart';
8 +import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart';
9 import 'package:cake_wallet/routes.dart';
10 import 'package:cake_wallet/src/screens/base_page.dart';
11 import 'package:cake_wallet/src/screens/dashboard/favorite_token_modal.dart';
12 -import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arrow.dart';
12 import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
14 -import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
15 -import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.dart';
13 import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart';
14 import 'package:cake_wallet/src/widgets/new_list_row/new_list_section.dart';
15 import 'package:cake_wallet/src/widgets/picker.dart';
@@ -186,30 +183,25 @@ class HomeSettingsPage extends BasePage {
183 'token': token,
184 });
185 },
189 - leading: Container(
190 - clipBehavior: Clip.hardEdge,
191 - decoration: BoxDecoration(shape: BoxShape.circle),
192 - child: CakeImageWidget(
193 - imageUrl: token.iconPath,
194 - height: 40,
195 - width: 40,
196 - errorWidget: Container(
197 - height: 30.0,
198 - width: 30.0,
199 - child: Center(
200 - child: Text(
201 - token.title.substring(0, min(token.title.length, 2)),
202 - style: Theme.of(context).textTheme.bodySmall?.copyWith(
203 - fontSize: 11,
204 - color: Theme.of(context).colorScheme.onSurfaceVariant,
205 - ),
206 - ),
207 - ),
208 - decoration: BoxDecoration(
209 - shape: BoxShape.circle,
210 - color: Theme.of(context).colorScheme.surfaceContainerHighest,
186 + leading: TokenImageWidget(
187 + imageUrl: token.iconPath ?? '',
188 + size: 40,
189 + errorWidget: Container(
190 + height: 30.0,
191 + width: 30.0,
192 + child: Center(
193 + child: Text(
194 + token.title.substring(0, min(token.title.length, 2)),
195 + style: Theme.of(context).textTheme.bodySmall?.copyWith(
196 + fontSize: 11,
197 + color: Theme.of(context).colorScheme.onSurfaceVariant,
198 + ),
199 ),
200 ),
201 + decoration: BoxDecoration(
202 + shape: BoxShape.circle,
203 + color: Theme.of(context).colorScheme.surfaceContainerHighest,
204 + ),
205 ),
206 ),
207 decoration: BoxDecoration(
lib/src/screens/receive/widgets/qr_image.dart
+4 -7
@@ -1,7 +1,5 @@
1 -import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
2 -import 'package:cw_core/utils/print_verbose.dart';
1 +import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart';
2 import 'package:flutter/material.dart';
4 -import 'package:flutter_svg/flutter_svg.dart';
3 import 'package:qr_flutter/qr_flutter.dart' as qr;
4
5 class QrImage extends StatelessWidget {
@@ -44,10 +42,9 @@ class QrImage extends StatelessWidget {
42 backgroundColor: backgroundColor,
43 padding: const EdgeInsets.all(12.0),
44 ),
47 - CakeImageWidget(imageUrl:
48 - imagePath,
49 - width: logoSize * 0.8,
50 - height: logoSize * 0.8,
45 + TokenImageWidget(
46 + imageUrl: imagePath,
47 + size: logoSize * 0.8,
48 ),
49 ],
50 );
lib/src/widgets/cake_image_widget.dart
+4
@@ -16,6 +16,7 @@ class CakeImageWidget extends StatelessWidget {
16 this.borderRadius = 24.0,
17 this.alignment,
18 this.allowDrawingOutsideViewBox,
19 + this.filterQuality,
20 });
21
22 final String? imageUrl;
@@ -29,6 +30,7 @@ class CakeImageWidget extends StatelessWidget {
30 final AlignmentGeometry? alignment;
31 final bool? allowDrawingOutsideViewBox;
32 final double borderRadius;
33 + final FilterQuality? filterQuality;
34
35 @override
36 Widget build(BuildContext context) {
@@ -69,6 +71,7 @@ class CakeImageWidget extends StatelessWidget {
71 width: width,
72 fit: fit,
73 color: color,
74 + filterQuality: filterQuality ?? FilterQuality.medium,
75 errorBuilder: (_, __, ___) => _buildErrorWidget(context),
76 );
77 }
@@ -93,6 +96,7 @@ class CakeImageWidget extends StatelessWidget {
96 width: width,
97 fit: fit ?? BoxFit.cover,
98 color: color,
99 + filterQuality: filterQuality ?? FilterQuality.medium,
100 loadingBuilder: (_, Widget child, ImageChunkEvent? progress) {
101 if (progress == null) return child;
102 return loadingWidget ?? const Center(child: CircularProgressIndicator());
lib/src/widgets/picker.dart
+3 -4
@@ -3,7 +3,7 @@
3 import 'dart:math';
4
5 import 'package:cake_wallet/entities/seed_type.dart';
6 -import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
6 +import 'package:cake_wallet/new-ui/widgets/coins_page/token_image_widget.dart';
7 import 'package:cake_wallet/src/widgets/search_bar_widget.dart';
8 import 'package:cake_wallet/themes/core/theme_extension.dart';
9 import 'package:cake_wallet/utils/responsive_layout_util.dart';
@@ -498,10 +498,9 @@ class _PickerState<Item> extends State<Picker<Item>> {
498 Widget? _getItemIcon(Item item) {
499 if (item is Currency) {
500 if (item.iconPath != null) {
501 - return CakeImageWidget(
501 + return TokenImageWidget(
502 imageUrl: item.iconPath!,
503 - height: 20.0,
504 - width: 20.0,
503 + size: 20.0,
504 );
505 } else {
506 return Container(