INDEX / JOURNAL / LOG-003
VOL. 2026 · ENGINEERING
SERIES 3 / 7
LOG-003 · STATE & SETSTATE

変化する状態は誰が持つのか

PUBLISHED
2026 · 06 · 26
AUTHOR
MIGIWAYA
READ
約 5 分
TAGS
#flutter#dart

§ 01STATELESS

lib/widgets/greeting.dartDART
class Greeting extends StatelessWidget {
const Greeting({super.key, required this.name});
 
final String name;
 
@override
Widget build(BuildContext context) {
return Text('こんにちは、$name さん');
}
}

§ 02STATEFUL

lib/widgets/counter.dartDART
class Counter extends StatefulWidget {
const Counter({super.key});
 
@override
State<Counter> createState() => _CounterState();
}
 
class _CounterState extends State<Counter> {
int _count = 0;
 
@override
Widget build(BuildContext context) {
return TextButton(
onPressed: () => setState(() => _count++),
child: Text('タップ回数: $_count'),
);
}
}

§ 03SETSTATE

DART
onPressed: () => setState(() => _count++),

§ 04LIFECYCLE

メソッドいつ主な用途
生成時に一度コントローラ生成、購読の開始
initState() 直後、および依存する InheritedWidget が変わったとき.of(context) に依存する初期化
親が同じ位置へ、同じ型・key の新しい Widget を渡したとき新しい設定に State を追従させる
破棄時に一度コントローラ破棄、購読・タイマーの解除
再構築のたびUI を描く
lib/widgets/ticking_clock.dartDART
class _TickingClockState extends State<TickingClock> {
Timer? _timer;
Duration _elapsed = Duration.zero;
 
@override
void initState() {
super.initState();
_timer = Timer.periodic(const Duration(seconds: 1), (_) {
setState(() => _elapsed += const Duration(seconds: 1));
});
}
 
@override
void dispose() {
_timer?.cancel(); // ← これを忘れると破棄後も動き続けてリークする
super.dispose();
}
 
@override
Widget build(BuildContext context) => Text('${_elapsed.inSeconds} 秒');
}

§ 05BOUNDARY

§ 06SUMMARY

脚注 · NOTES
  1. [1]
  2. [2]
  3. [3]
同シリーズ · Flutter の基礎を実コードで学ぶ
§ + RELATED すべて見る →
INQUIRY
CONTACT
LOCATION
STATUS
Active / Open
ESTABLISHED
2024 · 5 · 5
FORM