Skip to content

Instantly share code, notes, and snippets.

@matuella
Created October 8, 2021 18:20
Show Gist options
  • Save matuella/89f0f3e5abfd711011eed53efd754b24 to your computer and use it in GitHub Desktop.
Save matuella/89f0f3e5abfd711011eed53efd754b24 to your computer and use it in GitHub Desktop.
Why aren't nested overrides being scoped and recreating a new instance of its parent?
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class App extends StatelessWidget {
const App({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ProviderScope(
child: MaterialApp(
home: Scaffold(
body: Center(
child: NestedWidget(),
),
),
),
);
}
}
final overridableProvider = Provider<String>((_) => throw UnimplementedError());
final dependantProvider = Provider<String>(
(ref) {
return 'Received arg: ${ref.watch(overridableProvider)}';
},
dependencies: [overridableProvider],
);
class NestedWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ProviderScope(
overrides: [overridableProvider.overrideWithValue('OVERRIDED VALUE')],
child: Consumer(builder: (_, ref, __) {
final val1 = ref.watch(dependantProvider);
return ProviderScope(
overrides: [overridableProvider.overrideWithValue('OVERRIDED VALUE 2')],
child: Consumer(builder: (_, ref, __) {
final val2 = ref.watch(dependantProvider);
return ProviderScope(
overrides: [overridableProvider.overrideWithValue('OVERRIDED VALUE 3')],
child: Consumer(builder: (_, ref, __) {
final val3 = ref.watch(dependantProvider);
return Text('$val1\n$val2\n$val3');
}),
);
}),
);
}),
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment