How to solve "Do not use BuildContext across async gaps" in Riverpod's ConsumerWidget?

523 Views Asked by At

I get the warning "Do not use BuildContext across async gaps" when I use code like this:

await ref.read(testFutureProvider.notifier).doSomethingAsync();
Navigator.of(context).pop();

Normally it is possible to check the mounted property like this:

if(!mounted) return;

or

if(!context.mounted) return;

How can I avoid using BuildContext across async gaps in Riverpod in a ConsumerWidget?

3

There are 3 best solutions below

2
On BEST ANSWER

The solution is to retrieve everything depending on your BuildContext before running async code:

NavigatorState nav = Navigator.of(context);
await ref.read(testFutureProvider.notifier).doSomethingAsync();
nav.pop();
2
On

Try this:

ref.read(testFutureProvider.notifier).doSomethingAsync().then((value){
    Navigator.of(context).pop();
})
0
On

Try the following code:

try {
  await ref.read(testFutureProvider.notifier).doSomethingAsync();
} catch (e) {
  debugPrint(e);
} finally {
  Navigator.of(context).pop();
}

await ref.read(testFutureProvider.notifier).doSomethingAsync().then((value) => Navigator.of(context).pop()).catchError((e) => debugPrint(e));

I suggest you choose one of the two codes above as they both check for errors for you.