fix lag on saving frozen coin status (#3164)

* fix lag on saving frozen coin status

* wrap saveUnspentCoinInfo in @action

* revert fix + safeguard coin control page
This commit is contained in:
malik1004x
2026-04-15 14:31:44 +02:00
committed by GitHub
parent 586a040e4a
commit fb14d07fc7
4 changed files with 35 additions and 11 deletions
+23 -5
View File
@@ -4,7 +4,6 @@ import 'package:cake_wallet/new-ui/widgets/modal_header.dart';
import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_list_view_model.dart';
import 'package:cw_core/utils/print_verbose.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
@@ -32,6 +31,10 @@ class _NewCoinControlPageState extends State<NewCoinControlPage> {
Widget build(BuildContext context) {
return PopScope(
canPop: !widget.unspentCoinsListViewModel.isSavingItems,
onPopInvokedWithResult: (didPop, result) async{
await widget.unspentCoinsListViewModel.dispose();
if(!didPop && mounted) Navigator.of(context).pop();
},
child: Material(
borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
color: Colors.transparent,
@@ -42,10 +45,25 @@ class _NewCoinControlPageState extends State<NewCoinControlPage> {
child: Column(
children: [
ModalTopBar(
title: "",
onLeadingPressed: Navigator.of(context).pop,
leadingIcon: Icon(Icons.arrow_back_ios_new),
onTrailingPressed: () {}),
title: "",
trailingWidget: GestureDetector(
onTap: Navigator.of(context).pop,
child: Container(
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surfaceContainer,
borderRadius: BorderRadius.circular(99999)),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 8.0),
child: Text(
S.of(context).done,
style: TextStyle(
color: Theme.of(context).colorScheme.primary,
fontWeight: FontWeight.w600),
),
),
),
),
),
FutureBuilder(
future: _initialization,
builder: (context, asyncSnapshot) {
+6 -2
View File
@@ -11,6 +11,7 @@ import 'package:cake_wallet/exchange/trade.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/monero/monero.dart';
import 'package:cake_wallet/new-ui/modal_navigator.dart';
import 'package:cake_wallet/new-ui/pages/coin_control_page.dart';
import 'package:cake_wallet/new-ui/widgets/animated_dropdown.dart';
import 'package:cake_wallet/new-ui/widgets/keyboard_hide_overlay.dart';
import 'package:cake_wallet/new-ui/widgets/picker.dart';
@@ -513,8 +514,11 @@ class _NewSendPageState extends State<NewSendPage> {
ListItemRegularRowWidget(
keyValue: "",
label: "Coin Control",
onTap: () => Navigator.of(context)
.pushNamed(Routes.unspentCoinsList),
onTap: () {
showCupertinoModalBottomSheet(enableDrag: false, useRootNavigator: true, isDismissible: false, context: context, builder: (context){
return NewCoinControlPage(unspentCoinsListViewModel: widget.sendViewModel.unspentCoinsListViewModel,);
});
}
),
]),
)
@@ -2,15 +2,16 @@ import 'package:cake_wallet/entities/new_ui_entities/list_item/list_item_regular
import 'package:cake_wallet/entities/new_ui_entities/list_item/list_item_selector.dart';
import 'package:cake_wallet/entities/new_ui_entities/list_item/list_item_toggle.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/new-ui/pages/coin_control_page.dart';
import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
import 'package:cake_wallet/new-ui/widgets/swap_page/provider_options_page.dart';
import 'package:cake_wallet/new-ui/widgets/swap_page/refund_address_modal.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/widgets/new_list_row/new_list_section.dart';
import 'package:cake_wallet/view_model/exchange/exchange_view_model.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
class SwapOptionsPage extends StatelessWidget {
const SwapOptionsPage({super.key, required this.exchangeViewModel});
@@ -100,7 +101,9 @@ class SwapOptionsPage extends StatelessWidget {
keyValue: "coin control",
label: "Coin Control",
onTap: () {
Navigator.of(context).pushNamed(Routes.unspentCoinsList);
showCupertinoModalBottomSheet(enableDrag: false, useRootNavigator: true, isDismissible: false, context: context, builder: (context){
return NewCoinControlPage(unspentCoinsListViewModel: exchangeViewModel.unspentCoinsListViewModel,);
});
}),
ListItemSelector(
keyValue: "curr",
@@ -116,6 +116,7 @@ abstract class UnspentCoinsListViewModelBase with Store {
bool get hasAdjustableFieldChanged => items.any(_hasAdjustableFieldChanged);
@action
Future<void> saveUnspentCoinInfo(UnspentCoinsItem item) async {
try {
item.isBeingSaved = true;
@@ -129,8 +130,6 @@ abstract class UnspentCoinsListViewModelBase with Store {
existingInfo.note = item.note;
await existingInfo.save();
await _updateUnspents();
await wallet.updateBalance();
item.isBeingSaved = false;
isSavingItems = false;
} catch (e) {