Em Flutter, os widgets são divididos em duas categorias principais: Stateless e Stateful.


StatelessWidget

StatelessWidget é um tipo de widget que não tem estado interno mutável. Isso significa que, uma vez que um StatelessWidget é construído com um conjunto de parâmetros (também conhecidos como propriedades), seus atributos visuais não podem ser alterados. Um StatelessWidget é imutável e não reage a mudanças internas. Ele é ideal para componentes simples e estáticos, como textos, ícones ou contêineres que não precisam ser redesenhados.


Exemplo de StatelessWidget:

import 'package:flutter/material.dart';

class GreetingWidget extends StatelessWidget {
  final String message;

  const GreetingWidget({required this.message});

  @override
  Widget build(BuildContext context) {
    return Text(message);
  }
}


StatefulWidget

StatefulWidget, por outro lado, é um tipo de widget que tem um estado interno mutável. Este widget pode ser reconstruído quando seu estado muda. Ele consiste em duas classes: a classe que estende StatefulWidget e a classe que estende State, onde o estado é mantido e modificado.

Quando o estado de um StatefulWidget muda (por exemplo, quando um botão é pressionado, uma caixa de texto é editada etc.), o método setState() é chamado, indicando ao Flutter que ele precisa redesenhar o widget para refletir as mudanças no estado.


Exemplo de StatefulWidget:

import 'package:flutter/material.dart';

class CounterWidget extends StatefulWidget {
  @override
  _CounterWidgetState createState() => _CounterWidgetState();
}

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

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

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text('Contagem: $_counter'),
        ElevatedButton(
          onPressed: _incrementCounter,
          child: Text('Incrementar'),
        ),
      ],
    );
  }
}


Em resumo, a diferença principal entre StatelessWidget e StatefulWidget é a capacidade de ter um estado mutável. StatelessWidget não possui estado interno e é estático, enquanto StatefulWidget possui um estado mutável e pode ser reconstruído quando esse estado muda.