Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/leancode_hooks/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 0.1.2

- Make `usePostFrameEffect` `keys` parameter nullable to allow effect to run on every build.

# 0.1.1

- Bump `bloc` to `9.0.0`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
/// [WidgetsBinding.addPostFrameCallback].
void usePostFrameEffect(
VoidCallback effect, {
List<Object?> keys = const [],
List<Object?>? keys = const [],
}) {
useEffect(
() {
Expand Down
2 changes: 1 addition & 1 deletion packages/leancode_hooks/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: leancode_hooks
version: 0.1.1
version: 0.1.2
homepage: https://github.com/leancodepl/flutter_corelibrary/tree/master/packages/leancode_hooks
repository: https://github.com/leancodepl/flutter_corelibrary
description: >-
Expand Down
52 changes: 52 additions & 0 deletions packages/leancode_hooks/test/use_post_frame_effect_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,34 @@ class UsePostFrameEffectTestWidget extends HookWidget {
}
}

class UsePostFrameEffectWithNullKeysTestWidget extends HookWidget {
const UsePostFrameEffectWithNullKeysTestWidget({super.key});

@override
Widget build(BuildContext context) {
final counter = useState(0);
final effectCallCount = useState(0);

usePostFrameEffect(
() => effectCallCount.value++,
keys: null,
);

return MaterialApp(
home: Column(
children: [
Text('counter: ${counter.value}'),
Text('effectCallCount: ${effectCallCount.value}'),
ElevatedButton(
onPressed: () => counter.value++,
child: const Text('Increment'),
),
],
),
);
}
}

void main() {
testWidgets('effect gets called post frame', (tester) async {
await tester.pumpWidget(const UsePostFrameEffectTestWidget());
Expand All @@ -29,4 +57,28 @@ void main() {

expect(find.text('true'), findsOneWidget);
});

testWidgets('effect runs on every build when keys is null', (tester) async {
await tester.pumpWidget(const UsePostFrameEffectWithNullKeysTestWidget());

// Wait for first post-frame callback
await tester.pumpAndSettle();

// Effect should have been called once
expect(find.text('effectCallCount: 1'), findsOneWidget);

// Trigger a rebuild by clicking the button
await tester.tap(find.byType(ElevatedButton));
await tester.pumpAndSettle();

// Effect should have been called again
expect(find.text('effectCallCount: 2'), findsOneWidget);

// Trigger another rebuild
await tester.tap(find.byType(ElevatedButton));
await tester.pumpAndSettle();

// Effect should have been called a third time
expect(find.text('effectCallCount: 3'), findsOneWidget);
});
}
Loading