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(