diff --git a/lib/src/screens/start_tor/start_tor_page.dart b/lib/src/screens/start_tor/start_tor_page.dart index 8e0b7524d..71e3c3dd6 100644 --- a/lib/src/screens/start_tor/start_tor_page.dart +++ b/lib/src/screens/start_tor/start_tor_page.dart @@ -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), + ], + ], ), ], ), diff --git a/lib/utils/tor.dart b/lib/utils/tor.dart index 19ea0ba80..6a65208a4 100644 --- a/lib/utils/tor.dart +++ b/lib/utils/tor.dart @@ -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 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 ensureTorStarted({required BuildContext? context}) async { @@ -22,22 +27,37 @@ Future 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 showFullscreenDialog(BuildContext context) async { - await showDialog( - context: context, - barrierDismissible: false, - builder: (context) { - return PopScope( +Future 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 showFullscreenDialog(BuildContext context) async { child: CircularProgressIndicator( color: Colors.white, ), + ), ), - ), - ); - }, + ); + }, + ), ); + await Future.delayed(const Duration(seconds: 1)); + return dialogContext!; } Future dismissFullscreenDialog(BuildContext context) async { + await Future.delayed(const Duration(seconds: 1)); Navigator.of(context).pop(); } \ No newline at end of file diff --git a/lib/view_model/start_tor_view_model.dart b/lib/view_model/start_tor_view_model.dart index e2008b70e..2cd0e7c65 100644 --- a/lib/view_model/start_tor_view_model.dart +++ b/lib/view_model/start_tor_view_model.dart @@ -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.wallet?.connectToNode(node: appStore.settingsStore.getCurrentNode(appStore.wallet!.type)); Navigator.pushReplacementNamed(context, Routes.login); }