Skip to content

Commit 63db262

Browse files
authored
fix: 133 signal builder unnecessary rebuilds (#135)
1 parent 8265c91 commit 63db262

4 files changed

Lines changed: 18 additions & 3 deletions

File tree

packages/flutter_solidart/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.3.1
2+
3+
- **FIX**: `SignalBuilder` rebuilded twice when a signal changed, added unit test to prevent this from happening again.
4+
15
## 2.3.0
26

37
### Changes from solidart

packages/flutter_solidart/lib/src/widgets/signal_builder.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ class SignalBuilderElement extends ComponentElement {
108108
Effect? _effect;
109109

110110
SignalBuilder get _widget => widget as SignalBuilder;
111+
Widget? _builtWidget;
111112

112113
@override
113114
void mount(Element? parent, Object? newSlot) {
@@ -142,7 +143,7 @@ class SignalBuilderElement extends ComponentElement {
142143
Future<void> _invalidate() async {
143144
// // if the element is already dirty, we don't need to ask another rebuild
144145
if (dirty) return;
145-
_widget.build(_parent!);
146+
_builtWidget = _widget.build(_parent!);
146147

147148
if (_shouldWaitScheduler) {
148149
await SchedulerBinding.instance.endOfFrame;
@@ -166,7 +167,7 @@ class SignalBuilderElement extends ComponentElement {
166167
reactiveSystem.activeSub = _effect?.subscriber;
167168

168169
try {
169-
return _widget.build(_parent!);
170+
return _builtWidget ??= _widget.build(_parent!);
170171
} finally {
171172
reactiveSystem.activeSub = prevSub;
172173
}

packages/flutter_solidart/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: flutter_solidart
22
description: A simple State Management solution for Flutter applications inspired by SolidJS
3-
version: 2.3.0
3+
version: 2.3.1
44
repository: https://github.com/nank1ro/solidart
55
documentation: https://solidart.mariuti.com
66
topics:

packages/flutter_solidart/test/flutter_solidart_test.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,13 @@ void main() {
258258

259259
testWidgets('SignalBuilder works properly (1 Signal)', (tester) async {
260260
final s = Signal(0);
261+
var buildsCount = 0;
261262
await tester.pumpWidget(
262263
MaterialApp(
263264
home: Scaffold(
264265
body: SignalBuilder(
265266
builder: (context, child) {
267+
buildsCount++;
266268
return Text(s.value.toString());
267269
},
268270
),
@@ -272,9 +274,17 @@ void main() {
272274
Finder dataFinder(int value) => find.text('$value');
273275

274276
expect(dataFinder(0), findsOneWidget);
277+
expect(buildsCount, 1);
278+
275279
s.value++;
276280
await tester.pumpAndSettle();
277281
expect(dataFinder(1), findsOneWidget);
282+
expect(buildsCount, 2);
283+
284+
s.value++;
285+
await tester.pumpAndSettle();
286+
expect(dataFinder(2), findsOneWidget);
287+
expect(buildsCount, 3);
278288
});
279289

280290
testWidgets('SignalBuilder works properly (2 Signals)', (tester) async {

0 commit comments

Comments
 (0)