Чтобы объяснить это, я собираюсь использовать простой код, который обновляет текстовый виджет при каждом нажатии кнопки. Возможно, вы знаете, что есть два класса, на самом деле их три.

  1. Виджет без состояния
  2. Виджет с отслеживанием состояния
  3. Унаследованный виджет

Виджет без состояния неизменяем, и когда мы хотим изменить что-то, что отображается, нам нужно создать новый.

Stateful Widget является изменяемым и может взаимодействовать с пользователями. Когда мы хотим перерисовать/изменить что-то отображаемое, нам нужно использовать этот виджет. Чтобы использовать этот виджет, нам нужны два класса. И для перерисовки дисплея у нас есть вызов метода setState().

Унаследованный виджет представляет собой смесь обоих вышеперечисленных.

Я думаю, теперь вы понимаете, что это за виджет, который нам нужно использовать для этой ситуации. Это виджет с отслеживанием состояния. Вы правильно догадались?

Итак, вот полный код, и я объясню его один за другим.

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        title: 'Converter App',
        theme: new ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: new Scaffold(
          appBar: new AppBar(
            title: new Text('Converter App'),
          ),
          body: new Center(
            child: new Converter(),
          ),
        )
    );
  }

}

class Converter extends StatefulWidget {
  @override
  _ConverterWidget createState() => new _ConverterWidget();
}

class _ConverterWidget extends State<Converter> {
  String value = "click Me";
  @override
  Widget build(BuildContext context) {
    return new Column(
      children: <Widget>[
        new Text(value),
        new RaisedButton(
          child: new Text('Click me'),
          onPressed: () {
            setState(() {
              value += ' Me';
            });
          },
        ),
      ],
    );
  }
}

Первоначально опубликовано на сайте slcoderlk.blogspot.com 15 марта 2018 г.