Occasional white screen
I am using ADB2CEmbedWebView to login in a Flutter app. Occasionally the url is not reached and the app is just showing a white screen. This mostly happens running the app in Android Studio.
Before I run ADB2CEmbedWebView I lookup the url's dns to ensure it can be reached and then only run ADB2CEmbedWebView.
Can someone please let me know how to catch the exception or fix it?
import 'dart:async';
import 'package:aad_b2c_webview/aad_b2c_webview.dart';
import 'package:dnsolve/dnsolve.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:logger/logger.dart';
import 'package:mhrm/constants/app_colors.dart';
import 'package:mhrm/constants/app_constants.dart';
import 'package:mhrm/constants/typography.dart';
import 'package:mhrm/navigation/navigation_utils.dart';
import 'package:mhrm/providers/notifiers_provider.dart';
import 'package:mhrm/services/notifiers/auth/states/auth_state.dart';
import 'package:mhrm/utils/app_localizations.dart';
import 'package:mhrm/widgets/generic/dialog/one_button_popup.dart';
class LoginPage extends ConsumerStatefulWidget {
const LoginPage({super.key});
@override
ConsumerState<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends ConsumerState<LoginPage> {
final Logger _logger = Logger();
String? _userToken;
late Timer _watchdogTimer;
late Timer _reloadTimer;
int _count = 0;
bool _canReach = false;
onRedirect(BuildContext context) async {
_logger.d('LoginPage onRedirect ');
var token = _userToken ?? "";
await ref.read(authProvider.notifier).setAccessToken(token);
}
onRefreshToken(Token token) async {
_logger.d('LoginPage onRefreshToken ');
await ref.read(authProvider.notifier).setRefreshToken(token.value);
}
backToSplash() {
_watchdogTimer.cancel();
Future.delayed(Duration.zero, () {
GoRouter.of(context).go(splashPath);
});
}
reloadLogin() {
Future.delayed(Duration.zero, () {
GoRouter.of(context).go(loginPath);
});
}
@override
void initState() {
_watchdogTimer = Timer(const Duration(seconds: 300), () {
_logger.d('LoginPage timeout');
backToSplash();
});
_reloadTimer = Timer(const Duration(milliseconds: 500), () {
_logger.d('LoginPage Reload');
reloadLogin();
});
super.initState();
}
@override
void dispose() {
_watchdogTimer.cancel();
_reloadTimer.cancel();
super.dispose();
}
Future<void> dNSolve() async {
ResolveResponse response = await dnsLookup();
if (response.answer!.records != null) {
for (final record in response.answer!.records!) {
_logger.d('LoginPage DNS resolved ${record.toBind}');
}
setState(() {
_canReach = true;
});
} else {
_logger.d('LoginPage $_count try DNS could not be resolved!! ');
setState(() {
_count++;
_canReach = false;
});
}
}
Future<ResolveResponse> dnsLookup() async {
final dnSolve = DNSolve();
return await dnSolve.lookup(
//'dgsgd',
'https://mhrb2cdev.b2clogin.com',
dnsSec: true,
type: RecordType.srv,
);
}
@override
Widget build(BuildContext context) {
final localizations = AppLocalizations.of(context);
final AuthState authState = ref.watch(authProvider);
if (_count < 4 && !_canReach) {
dNSolve();
if (_count >= 3) {
Future.delayed(Duration.zero, () {
OneButtonPopup.showPopupDialog(
context: context,
heading: localizations.translate('dns_error'),
buttonString: localizations.translate('reload'),
onButton: () {},
body: Text(
localizations.translate('dns_error_info'),
style: TypeScale.s12w500grey8x404040,
),
);
backToSplash();
});
}
}
if (authState.isAuthenticated) {
_watchdogTimer.cancel();
Future.delayed(Duration.zero, () {
GoRouter.of(context).go(homePath);
});
}
if (_canReach) {
return Scaffold(
body: Column(
children: [
Expanded(
child: ADB2CEmbedWebView(
tenantBaseUrl: AppConstants.aadB2CUserAuthFlow,
userFlowName: AppConstants.aadB2CUserFlowName,
clientId: AppConstants.aadB2CClientID,
redirectUrl: AppConstants.aadB2CRedirectURL,
scopes: AppConstants.aadB2CScopes,
onAnyTokenRetrieved: (Token anyToken) {
_logger.d('LoginPage onAnyTokenRetrieved type ${anyToken.type}');
},
onIDToken: (Token token) {
_logger.d('LoginPage onIDToken type ${token.type}');
_userToken = token.value;
},
onAccessToken: (Token token) {
_logger.d('LoginPage onAccessToken type ${token.type}');
},
onRefreshToken: onRefreshToken,
onErrorOrCancel: (context) {
_logger.d('LoginPage ADB2CEmbedWebView onErrorOrCancel');
backToSplash();
},
optionalParameters: const [],
onRedirect: onRedirect,
),
),
ElevatedButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(
AppColors.grey6x737373,
),
shadowColor: MaterialStateProperty.all(
AppColors.grey2xD9D9D9,
),
elevation: MaterialStateProperty.all<double>(0),
),
onPressed: () {
backToSplash();
},
child: Text(
localizations.translate('reload_login_page'),
style: TypeScale.s12w500white,
),
),
],
),
);
} else {
return Container(
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/images/login_background.jpg"),
fit: BoxFit.cover,
),
),
child: Column(
children: [
const SizedBox(
height: 142,
),
Image.asset(
"assets/images/logo/logo.png",
fit: BoxFit.cover,
width: 232,
height: 155,
),
],
),
);
}
}
}
I/flutter (17740): │ #0 AADB2CAuthService.refreshAuthToken (package:mhrm/services/auth/aadb2c_auth_service.dart:258:12)
I/flutter (17740): │ #1
I/flutter (17740): │ 🐛 refreshAuthToken ServiceResult.success(authTokenResponse.idToken!)
I/ViewRootImpl@ca848a1MainActivity: ViewPostIme pointer 0 I/ViewRootImpl@ca848a1MainActivity: ViewPostIme pointer 1 [GoRouter] going to /login W/WindowOnBackDispatcher(17740): sendCancelIfRunning: isInProgress=falsecallback=io.flutter.embedding.android.FlutterActivity$1@ed8ff44
I/flutter (17740): │ #0 _LoginPageState.initState.
I/flutter (17740): │ 🐛 LoginPage Reload
[GoRouter] going to /login
I/flutter (17740): │ #0 _LoginPageState.dNSolve (package:mhrm/screens/login/login_screen.dart:82:17)
I/flutter (17740): │ #1
I/flutter (17740): │ 🐛 LoginPage DNS resolved https://mhrb2cdev.b2clogin.com. 300 IN CNAME "prda.aadg.msidentity.com."
I/flutter (17740): │ #0 _LoginPageState.dNSolve (package:mhrm/screens/login/login_screen.dart:82:17)
I/flutter (17740): │ #1
I/flutter (17740): │ 🐛 LoginPage DNS resolved prda.aadg.msidentity.com. 9 IN CNAME "www.tm.a.prd.aadg.akadns.net."
W/ziparchive(17740): Unable to open '/data/app/~~IGlevzahHjeBRxkXyjMtMA==/com.google.android.trichromelibrary_636705433-6hI3TlGcTqglbAKrVN1oAg==/base.dm': No such file or directory W/ziparchive(17740): Unable to open '/data/app/~~IGlevzahHjeBRxkXyjMtMA==/com.google.android.trichromelibrary_636705433-6hI3TlGcTqglbAKrVN1oAg==/base.dm': No such file or directory W/mhrmpanelmember(17740): Entry not found D/nativeloader(17740): Configuring clns-5 for other apk /data/app/~~IGlevzahHjeBRxkXyjMtMA==/com.google.android.trichromelibrary_636705433-6hI3TlGcTqglbAKrVN1oAg==/base.apk. target_sdk_version=34, uses_libraries=ALL, library_path=/data/app/~~DQlDmqjEPDgxDA_qXa2JGA==/com.google.android.webview-ZbwGemP2oeVUcabVu4t7EQ==/lib/arm64:/data/app/~~DQlDmqjEPDgxDA_qXa2JGA==/com.google.android.webview-ZbwGemP2oeVUcabVu4t7EQ==/base.apk!/lib/arm64-v8a:/data/app/~~IGlevzahHjeBRxkXyjMtMA==/com.google.android.trichromelibrary_636705433-6hI3TlGcTqglbAKrVN1oAg==/base.apk!/lib/arm64-v8a, permitted_path=/data:/mnt/expand D/nativeloader(17740): Extending system_exposed_libraries: libaudiomirroring_jni.audiomirroring.samsung.so:lib.engmodejni.samsung.so:libheifcapture_jni.media.samsung.so:libjpegsq.media.samsung.so:libslljpeg.media.samsung.so:libsemimagecrop_jni.media.samsung.so:libsimba.media.samsung.so:libamDNN.media.samsung.so:libamDNN.media.samsung.so:libapex_motionphoto_utils_jni.media.samsung.so:libsume_mediabuffer_jni.media.samsung.so:libSlowShutter_jni.media.samsung.so:libapex_jni.media.samsung.so:libsume_jni.media.samsung.so:libneural.snap.samsung.so:libsecuresnap_aidl.snap.samsung.so:libsnap_aidl.snap.samsung.so:libeden_rt_stub.edensdk.samsung.so:libSDKRecognitionOCR.spenocr.samsung.so:libSDKMoireDetector.spenocr.samsung.so:libtensorflowlite_c.spenocr.samsung.so:libSFEffect.fonteffect.samsung.so:libperfsdk.performance.samsung.so:libvesgraphicframework.videoeditor.samsung.so:libvesinterface.videoeditor.samsung.so:libvesframework.videoeditor.samsung.so:libveframework.videoeditor.samsung.so:lib_vnd_client.dk.samsung.so:lib_native_client.dk.sa D/nativeloader(17740): Configuring clns-6 for other apk /data/app/~~DQlDmqjEPDgxDA_qXa2JGA==/com.google.android.webview-ZbwGemP2oeVUcabVu4t7EQ==/base.apk. target_sdk_version=34, uses_libraries=, library_path=/data/app/~~DQlDmqjEPDgxDA_qXa2JGA==/com.google.android.webview-ZbwGemP2oeVUcabVu4t7EQ==/lib/arm64:/data/app/~~DQlDmqjEPDgxDA_qXa2JGA==/com.google.android.webview-ZbwGemP2oeVUcabVu4t7EQ==/base.apk!/lib/arm64-v8a:/data/app/~~IGlevzahHjeBRxkXyjMtMA==/com.google.android.trichromelibrary_636705433-6hI3TlGcTqglbAKrVN1oAg==/base.apk!/lib/arm64-v8a, permitted_path=/data:/mnt/expand I/WebViewFactory(17740): Loading com.google.android.webview version 124.0.6367.54 (code 636705433) I/cr_WVCFactoryProvider(17740): Loaded version=124.0.6367.54 minSdkVersion=29 isBundle=true multiprocess=true packageId=2 I/chromium(17740): [0422/083738.202748:INFO:variations_seed_loader.cc(66)] Failed to open file for reading.: No such file or directory (2) I/cr_LibraryLoader(17740): Successfully loaded native library I/cr_CachingUmaRecorder(17740): Flushed 6 samples from 6 histograms, 0 samples were dropped. I/cr_CombinedPProvider(17740): #registerProvider() provider:WV.V7@eb97547 isPolicyCacheEnabled:false policyProvidersSize:0 I/cr_PolicyProvider(17740): #setManagerAndSource() 0 I/cr_CombinedPProvider(17740): #linkNativeInternal() 1 I/cr_AppResProvider(17740): #getApplicationRestrictionsFromUserManager() Bundle[EMPTY_PARCEL] I/cr_PolicyProvider(17740): #notifySettingsAvailable() 0 I/cr_CombinedPProvider(17740): #onSettingsAvailable() 0 I/cr_CombinedPProvider(17740): #flushPolicies() D/CompatibilityChangeReporter(17740): Compat change id reported: 214741472; UID 10542; state: ENABLED D/CompatibilityChangeReporter(17740): Compat change id reported: 171228096; UID 10542; state: ENABLED
D/ConnectivityManager(17740): StackLog:
[android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4401)]
[android.net.ConnectivityManager.registerDefaultNetworkCallbackForUid(ConnectivityManager.java:4965)]
[android.net.ConnectivityManager.registerDefaultNetworkCallback(ConnectivityManager.java:4932)]
[WV.mD.e(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:44)]
[WV.mD.b(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:1)]
[org.chromium.android_webview.AwContentsLifecycleNotifier.onFirstWebViewCreated(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:22)]
[J.N.MFiR_zHY(Native Method)]
[org.chromium.android_webview.AwContents.
D/ConnectivityManager(17740): StackLog: [android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4401)] [android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4443)] [android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:4825)] [WV.mD.e(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:93)] [WV.mD.b(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:1)] [org.chromium.android_webview.AwContentsLifecycleNotifier.onFirstWebViewCreated(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:22)] [J.N.MFiR_zHY(Native Method)] [org.chromium.android_webview.AwContents.