Skip to the content.

Stateful Widget

StatefulWidget memungkinkan kita membuat widget yang bisa diubah isinya pada runtime. Perhatikan contoh berikut:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Flutter Demo',
      home: FirstPage(),
    );
  }
}

class FirstPage extends StatefulWidget {
  const FirstPage({
    Key? key,
  }) : super(key: key);

  @override
  State<FirstPage> createState() => FirstPageState();
}

class FirstPageState extends State<FirstPage> {
  // deklarasi variabel yang akan digunakan
  int _counter = 0;

  // controller untuk membaca nilai angka yang diinut
  final angka = TextEditingController();

  // menambah counter dan merubah state
  void _incrementCounter() {
    setState(() {
      _counter++;
      angka.text = '$_counter';
    });
  }

  // mengubah nilai counter sesuai parameter 'value'
  void _setCounter(value) {
    setState(() {
      _counter = value;
      angka.text = '$_counter';
    });
  }

  @override
  void dispose() {
    // memastikan controller 'angka' dihapus ketika widget dihapus dari memori
    angka.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Halaman 1"),
      ),
      body: Center(
        child: Container(
          padding: EdgeInsets.all(20),
          child: Column(
            children: [
              Text(
                'Tombol telah ditekan $_counter kali',
              ),
              ElevatedButton(
                  onPressed: _incrementCounter, child: const Text('Tambah')),
              TextField(
                controller: angka, //link textfield ke controller `angka`
              ),
              ElevatedButton(
                  onPressed: () {
                    _setCounter(int.parse(angka.text));
                  },
                  child: const Text('Update'))
            ],
          ),
        ),
      ),
    );
  }
}