fix: tor switch properly dismisses fullscreen loading dialog

fix: connectToNode after tor startup on app start
This commit is contained in:
Czarek Nakamoto 2025-04-30 21:07:28 +02:00
parent efb395c0d1
commit 3b5b82a2f1
3 changed files with 51 additions and 28 deletions
lib
src/screens/start_tor
utils
view_model

View file

@ -27,22 +27,18 @@ class StartTorPage extends BasePage {
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Observer(
builder: (_) {
return Column(
children: [
SizedBox(width: double.maxFinite),
if (startTorViewModel.isLoading) ...[
CircularProgressIndicator(),
SizedBox(height: 20),
_buildWaitingText(context),
],
if (startTorViewModel.showOptions) ...[
_buildOptionsButtons(context),
],
Column(
children: [
SizedBox(width: double.maxFinite),
if (startTorViewModel.isLoading) ...[
CircularProgressIndicator(),
SizedBox(height: 20),
_buildWaitingText(context),
],
);
},
if (startTorViewModel.showOptions) ...[
_buildOptionsButtons(context),
],
],
),
],
),

View file

@ -1,6 +1,10 @@
import 'dart:async';
import 'dart:isolate';
import 'package:cw_core/utils/proxy_wrapper.dart';
import 'package:cw_core/utils/print_verbose.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:tor/tor.dart';
bool didTorStart = false;
@ -9,12 +13,13 @@ Future<void> ensureTorStopped({required BuildContext? context}) async {
printV("Tor hasn't been initialized yet, so it can't be stopped.");
return;
}
if (context != null) showFullscreenDialog(context);
BuildContext? dialogContext;
if (context != null) dialogContext = await showFullscreenDialog(context);
didTorStart = false;
printV("Stopping tor");
await CakeTor.instance.stop();
printV("Tor stopped");
if (context != null) dismissFullscreenDialog(context);
if (context != null) dismissFullscreenDialog(dialogContext!);
}
Future<void> ensureTorStarted({required BuildContext? context}) async {
@ -22,22 +27,37 @@ Future<void> ensureTorStarted({required BuildContext? context}) async {
printV("Tor has already started");
return;
}
if (context != null) showFullscreenDialog(context);
BuildContext? dialogContext;
if (context != null) dialogContext = await showFullscreenDialog(context);
didTorStart = true;
printV("Initializing tor");
await Tor.init();
printV("Starting tor");
// var rootToken = RootIsolateToken.instance!;
// await Isolate.run(() async {
// BackgroundIsolateBinaryMessenger.ensureInitialized(rootToken);
// await CakeTor.instance.start();
// });
// second start is fast but populates the values on current thread
await CakeTor.instance.start();
printV("Tor started");
if (context != null) dismissFullscreenDialog(context);
while (CakeTor.instance.port == -1) {
printV("Waiting for tor to start");
await Future.delayed(const Duration(seconds: 1));
}
printV("Tor started on port ${CakeTor.instance.port}");
if (context != null) dismissFullscreenDialog(dialogContext!);
}
Future<void> showFullscreenDialog(BuildContext context) async {
await showDialog(
context: context,
barrierDismissible: false,
builder: (context) {
return PopScope(
Future<BuildContext> showFullscreenDialog(BuildContext context) async {
BuildContext? dialogContext;
unawaited(
showDialog(
context: context,
barrierDismissible: false,
builder: (context) {
dialogContext = context;
return PopScope(
canPop: false,
child: Container(
color: Colors.transparent,
@ -45,13 +65,17 @@ Future<void> showFullscreenDialog(BuildContext context) async {
child: CircularProgressIndicator(
color: Colors.white,
),
),
),
),
);
},
);
},
),
);
await Future.delayed(const Duration(seconds: 1));
return dialogContext!;
}
Future<void> dismissFullscreenDialog(BuildContext context) async {
await Future.delayed(const Duration(seconds: 1));
Navigator.of(context).pop();
}

View file

@ -2,6 +2,7 @@ import 'dart:async';
import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/utils/tor.dart';
import 'package:flutter/material.dart';
@ -54,6 +55,8 @@ abstract class StartTorViewModelBase with Store {
}
await ensureTorStarted(context: null);
didStartTor = true;
final appStore = getIt.get<AppStore>();
appStore.wallet?.connectToNode(node: appStore.settingsStore.getCurrentNode(appStore.wallet!.type));
Navigator.pushReplacementNamed(context, Routes.login);
}