From f307676ca5671a430cd97b336ccf5a12cf91e9b6 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Sun, 11 Feb 2024 23:37:52 +0100 Subject: [PATCH] [iOS] separated camera handling logic --- .../bloc_container_camera.dart | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/screens/metering/components/camera_container/bloc_container_camera.dart b/lib/screens/metering/components/camera_container/bloc_container_camera.dart index cd91f59..8e8e9ff 100644 --- a/lib/screens/metering/components/camera_container/bloc_container_camera.dart +++ b/lib/screens/metering/components/camera_container/bloc_container_camera.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'dart:math' as math; import 'package:camera/camera.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -253,12 +254,29 @@ class _WidgetsBindingObserver with WidgetsBindingObserver { _WidgetsBindingObserver(this.onLifecycleStateChanged); + /// Revoking camera permissions results in app being killed both on Android and iOS @override void didChangeAppLifecycleState(AppLifecycleState state) { - if (_prevState == AppLifecycleState.inactive && state == AppLifecycleState.resumed) { - return; + switch (defaultTargetPlatform) { + /// On Android opening a dialog results in [AppLifecycleState.inactive] + case TargetPlatform.android: + if (_prevState == AppLifecycleState.inactive && state == AppLifecycleState.resumed) { + return; + } + _prevState = state; + onLifecycleStateChanged(state); + + /// When coming from the app's settings iOS fires paused -> inactive -> resumed state which falls into this condition. + /// So the inactive state is skipped. + case TargetPlatform.iOS: + if (state == AppLifecycleState.inactive) { + return; + } + if (_prevState != state) { + _prevState = state; + onLifecycleStateChanged(state); + } + default: } - _prevState = state; - onLifecycleStateChanged(state); } }