From 650e6a5e93701471dd643f0752030ca2300dfa56 Mon Sep 17 00:00:00 2001 From: Sander Kersten Date: Wed, 28 Feb 2024 18:07:43 +0100 Subject: [PATCH] Fix no rebuild when listening to context of Selector.builder (#863) Fixes #339 --- packages/provider/lib/src/selector.dart | 10 ++-- .../test/null_safe/selector_test.dart | 50 +++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/packages/provider/lib/src/selector.dart b/packages/provider/lib/src/selector.dart index 42354c2a..d5e7462f 100644 --- a/packages/provider/lib/src/selector.dart +++ b/packages/provider/lib/src/selector.dart @@ -82,10 +82,12 @@ class _Selector0State extends SingleChildState> { if (shouldInvalidateCache) { value = selected; oldWidget = widget; - cache = widget.builder( - context, - selected, - child, + cache = Builder( + builder: (context) => widget.builder( + context, + selected, + child, + ), ); } return cache!; diff --git a/packages/provider/test/null_safe/selector_test.dart b/packages/provider/test/null_safe/selector_test.dart index dc8db0d3..4435aa24 100644 --- a/packages/provider/test/null_safe/selector_test.dart +++ b/packages/provider/test/null_safe/selector_test.dart @@ -334,6 +334,36 @@ void main() { expect(find.text('24'), findsOneWidget); }); + testWidgets('rebuild when inherited widget changes', (tester) async { + final selectorWidget = Directionality( + textDirection: TextDirection.ltr, + child: Selector0( + selector: (_) => 0, + builder: (context, _, __) => + Text('${DummyInheritedWidget.of(context).data}'), + ), + ); + + await tester.pumpWidget( + DummyInheritedWidget( + data: 1, + child: selectorWidget, + ), + ); + + expect(find.text('1'), findsOneWidget); + + await tester.pumpWidget( + DummyInheritedWidget( + data: 2, + child: selectorWidget, + ), + ); + + expect(find.text('1'), findsNothing); + expect(find.text('2'), findsOneWidget); + }); + testWidgets('debugFillProperties', (tester) async { final builder = DiagnosticPropertiesBuilder(); final key = UniqueKey(); @@ -524,3 +554,23 @@ class MockBuilder extends Mock { ) as Widget; } } + +class DummyInheritedWidget extends InheritedWidget { + const DummyInheritedWidget({ + required this.data, + required Widget child, + Key? key, + }) : super(child: child, key: key); + + final int data; + + static DummyInheritedWidget of(BuildContext context) { + final result = + context.dependOnInheritedWidgetOfExactType(); + assert(result != null, 'No DummyInheritedWidget found in context'); + return result!; + } + + @override + bool updateShouldNotify(DummyInheritedWidget old) => old.data != data; +}