🧩

@Stateを理解したい

2023/11/24に公開

Overview

SwiftUIには、FlutterのsetStateと同じようなものがある。それが、@Stateです。ライフサイクルの説明をすると、画面が切り替わるとか、数字が増えていくユースケースで使用します。

https://developer.apple.com/documentation/swiftui/state

setStateについて知りたい人はこちらを見てください
仕組みは、単純で状態を保持したり画面が更新される仕組みですね。
https://zenn.dev/flutteruniv_dev/articles/aeee9e15255c43
https://api.flutter.dev/flutter/widgets/State/setState.html

Flutterのカウンターだとこんな感じですね
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return const MaterialApp(title: 'Flutter Demo', home: CounterWidget());
  }
}

class CounterWidget extends StatefulWidget {
  const CounterWidget({super.key});

  
  _CounterWidgetState createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text('Count: $_counter'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

summary

@Stateを使うときは、structの{}の下らへんに書きます。今回はカウンターアプリで例をご紹介します。

使い方

  1. 状態を扱う変数を定義する
@State var count: Int = 0
  1. カウンターを増減するボタンを作成する。{}の中に処理を書く。変数に、演算子をつけて、増減ができるようにする。
    足し算なら、= +1でも良いし+= 1と書くと、同じように機能する処理を書けます。
    引き算なら、= -1でも良いし-= 1と書くと、同じように機能する処理を書けます。

引き算

Button("-") {
                count -= 1
            }

足し算

Button("+") {
                count += 1
            }
全体のコード
import SwiftUI


struct ContentView: View {
    @State var count: Int = 0

    var body: some View {
        HStack {
            Button("-") {
                count -= 1
            }
            Text("Count: \(count)")
            Button("+") {
                count += 1
            }
        }
    }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

thoughts

今回使った@Stateについてまとめると...

@Stateの役割

  1. struct内で値を変更できるようにすること
  2. 値を変更したら、値を使っているViewを再描画する

Discussion