Flutter에서 사용할 수 있는 상태관리 중 하나인 Signal을 소개한다.
Signal은 새로운 것이 아니며 오랫동안 존재해왔다.
javascript 프레임워크에는 핵심 라이브러리의 일부로 포함되어 있다.
// 생성
final counter = signal(0);
// 사용
Watch((context) => Text('Counter: $counter'))
import 'package:signals/signals.dart';
final counter = signal(0);
// Read value from signal, logs: 0
print(counter.value);
// Write to a signal
counter.value = 1;
final counter = signal(0);
effect(() {
print(counter.value);
});
counter.value = 1;
final counter = signal(0);
effect(() {
print('Current value: ${counter.value}');
print('Previous value: ${counter.previousValue}');
});
counter.value = 1;
final counter = signal(0);
counter.set(1, force: true);
final s = signal(0, autoDispose: true);
s.onDispose(() => print('Signal destroyed'));
final dispose = s.subscribe((_) {});
dispose();
final value = s.value; // 0
// prints: Signal destroyed
final s = signal(0);
s.dispose();
final c = computed(() => s.value);
// c will not react to changes in s
final s = signal(0);
print(s.disposed); // false
s.dispose();
print(s.disposed); // true
import 'package:signals/signals.dart';
final name = signal("Jane");
final surname = signal("Doe");
final fullName = computed(() => name.value + " " + surname.value);
// Logs: "Jane Doe"
print(fullName.value);
// Updates flow through computed, but only if someone
// subscribes to it. More on that later.
name.value = "John";
// Logs: "John Doe"
print(fullName.value);
import 'package:signals/signals.dart';
final name = signal("Jane");
final surname = signal("Doe");
final fullName = computed(() => name.value + " " + surname.value);
// Logs: "Jane Doe"
effect(() => print(fullName.value));
// Updating one of its dependencies will automatically trigger
// the effect above, and will print "John Doe" to the console.
name.value = "John";
import 'package:signals/signals.dart';
final name = signal("Jane");
final surname = signal("Doe");
final fullName = computed(() => name.value + " " + surname.value);
// Logs: "Jane Doe"
effect(() => print(fullName.value));
// Combines both signal writes into one update. Once the callback
// returns the `effect` will trigger and we'll log "Foo Bar"
batch(() {
name.value = "Foo";
surname.value = "Bar";
});