Skip to content

ProviderObeserver filter certain errors #4365

@robpot95

Description

@robpot95

Describe the bug

ProviderDidFail: bProvider
              => error: Bad state: The provider aProvider was disposed during loading state, yet no value could be emitted.

To Reproduce
Create two screens. Screen A and Screen B. Screen A navigate you to screen B where it watches bProviderthen exit the screen and you will see the error

const String expToken =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE3NjAyODI5ODYsImV4cCI6MTc2MDI4Mjk4NywiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIkdpdmVuTmFtZSI6IkpvaG5ueSIsIlN1cm5hbWUiOiJSb2NrZXQiLCJFbWFpbCI6Impyb2NrZXRAZXhhbXBsZS5jb20iLCJSb2xlIjpbIk1hbmFnZXIiLCJQcm9qZWN0IEFkbWluaXN0cmF0b3IiXX0.GhUxTX_52dlsBYzFpop-KPruAjb8X8PR1jmT6aqaZAI";

@riverpod
Future<Response> a(Ref ref) async {
  final dio = Dio();
  final cancelToken = CancelToken();
  ref.onDispose(() {
    cancelToken.cancel();
    dio.close();
  });
  return dio.get(
    "https://dummyjson.com/auth/me?access-token=$expToken",
    cancelToken: cancelToken,
  );
}

@riverpod
Future<Response> b(Ref ref) => ref.watch(aProvider.future);
final class ProviderCrashlytics extends ProviderObserver {
  const ProviderCrashlytics();
  final name = "CRASHLYTICS";

  @override
  void didAddProvider(ProviderObserverContext context, Object? value) {
    if (value is! AsyncError) {
      return;
    }

    log(
      "⛔️ DidAddProvider: ${context.provider.name}\n"
      "=> error: ${value.error}\n"
      "=> stackTrace: ${value.stackTrace}",
      name: name,
    );
  }

  @override
  void providerDidFail(
    ProviderObserverContext context,
    Object error,
    StackTrace stackTrace,
  ) async {
    log(
      "⛔️ ProviderDidFail: ${context.provider.name}\n"
      "=> error: $error\n"
      "=> stackTrace: $stackTrace",
      name: name,
    );

    if (!kDebugMode && !DevicePlatform.isWeb) {
      unawaited(
        FirebaseCrashlytics.instance.recordError(
          error,
          stackTrace,
          reason: context.provider.name,
        ),
      );
    }
  }
}

Expected behavior
It should ignore the error

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions