fix: add reconnection logic to hardware wallet flow to handle tap-backs (#3458)

Konstantin Ullrich committed Jul 31, 2026 at 00:05 UTC 22015eb1e19e314c35c5d5c2ee83be8507a17c66
4 files changed +56 -25
lib/buy/dfx/dfx_buy_provider.dart
+17 -8
@@ -336,14 +336,23 @@ class DFXBuyProvider extends BuyProvider {
336 String? countryCode}) async {
337 if (wallet.isHardwareWallet) {
338 if (!hardwareWalletVM!.isConnected(wallet.walletInfo.type)) {
339 - await Navigator.of(context).pushNamed(Routes.connectDevices,
340 - arguments: ConnectDevicePageParams(
341 - walletType: wallet.walletInfo.type,
342 - hardwareWalletType: wallet.walletInfo.hardwareWalletType!,
343 - onConnectDevice: (context, hwwVM) {
344 - hwwVM.initWallet(wallet);
345 - Navigator.of(context).pop();
346 - }));
339 + await Navigator.of(context).pushNamed(
340 + Routes.connectDevices,
341 + arguments: ConnectDevicePageParams(
342 + walletType: wallet.walletInfo.type,
343 + hardwareWalletType: wallet.walletInfo.hardwareWalletType!,
344 + onConnectDevice: (context, hwwVM) {
345 + hwwVM.initWallet(wallet);
346 + Navigator.of(context).pop();
347 + },
348 + isReconnect: false,
349 + ),
350 + );
351 +
352 + // Recheck to handle tap-backs
353 + if (!hardwareWalletVM!.isConnected(wallet.walletInfo.type)) {
354 + return;
355 + }
356 } else {
357 hardwareWalletVM!.initWallet(wallet);
358 }
lib/buy/robinhood/robinhood_buy_provider.dart
+15 -8
@@ -174,14 +174,21 @@ class RobinhoodBuyProvider extends BuyProvider {
174 String? countryCode}) async {
175 if (wallet.isHardwareWallet) {
176 if (!hardwareWalletVM!.isConnected(wallet.walletInfo.type)) {
177 - await Navigator.of(context).pushNamed(Routes.connectDevices,
178 - arguments: ConnectDevicePageParams(
179 - walletType: wallet.walletInfo.type,
180 - hardwareWalletType: wallet.walletInfo.hardwareWalletType!,
181 - onConnectDevice: (context, hwwVM) {
182 - hwwVM.initWallet(wallet);
183 - Navigator.of(context).pop();
184 - }));
177 + await Navigator.of(context).pushNamed(
178 + Routes.connectDevices,
179 + arguments: ConnectDevicePageParams(
180 + walletType: wallet.walletInfo.type,
181 + hardwareWalletType: wallet.walletInfo.hardwareWalletType!,
182 + onConnectDevice: (context, hwwVM) {
183 + hwwVM.initWallet(wallet);
184 + Navigator.of(context).pop();
185 + },
186 + isReconnect: false,
187 + ),
188 + );
189 + if (!hardwareWalletVM!.isConnected(wallet.walletInfo.type)) {
190 + return;
191 + }
192 } else {
193 hardwareWalletVM!.initWallet(wallet);
194 }
lib/new-ui/pages/send_page.dart
+7
@@ -823,8 +823,15 @@ class _NewSendPageState extends State<NewSendPage> {
823 widget.sendViewModel.hardwareWalletViewModel!.initWallet(widget.sendViewModel.wallet);
824 Navigator.of(context).pop();
825 },
826 + isReconnect: false,
827 ),
828 );
829 +
830 + // Recheck to handle tap-backs
831 + if (!widget.sendViewModel.hardwareWalletViewModel!
832 + .isConnected(widget.sendViewModel.walletType)) {
833 + return;
834 + }
835 } else {
836 await widget.sendViewModel.hardwareWalletViewModel!.initWallet(widget.sendViewModel.wallet);
837 }
lib/new-ui/widgets/swap_page/swap_confirm_sheet.dart
+17 -9
@@ -47,15 +47,23 @@ class _SwapConfirmSheetState extends State<SwapConfirmSheet> {
47
48 if (sendVM.wallet.isHardwareWallet) {
49 if (!sendVM.hardwareWalletViewModel!.isConnected(sendVM.walletType)) {
50 - await Navigator.of(context).pushNamed(Routes.connectDevices,
51 - arguments: ConnectDevicePageParams(
52 - walletType: sendVM.walletType,
53 - hardwareWalletType: sendVM.wallet.walletInfo.hardwareWalletType!,
54 - onConnectDevice: (context, _) {
55 - sendVM.hardwareWalletViewModel!.initWallet(sendVM.wallet);
56 - Navigator.of(context).pop();
57 - },
58 - ));
50 + await Navigator.of(context).pushNamed(
51 + Routes.connectDevices,
52 + arguments: ConnectDevicePageParams(
53 + walletType: sendVM.walletType,
54 + hardwareWalletType: sendVM.wallet.walletInfo.hardwareWalletType!,
55 + onConnectDevice: (context, _) {
56 + sendVM.hardwareWalletViewModel!.initWallet(sendVM.wallet);
57 + Navigator.of(context).pop();
58 + },
59 + isReconnect: false,
60 + ),
61 + );
62 +
63 + // Recheck to handle tap-backs
64 + if (!sendVM.hardwareWalletViewModel!.isConnected(sendVM.walletType)) {
65 + return;
66 + }
67 } else {
68 sendVM.hardwareWalletViewModel!.initWallet(sendVM.wallet);
69 }