Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

SnackBar do Scaffold.of parou de funcionar

Olá, pessoal!

Criei uma snackbar que aparece como uma mensagem de sucesso pro usuário. Porém, após a mudança de estrutura de páginas, ele parou de funcionar. Recebo a seguinte mensagem no console:

[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: Scaffold.of() called with a context that does not contain a Scaffold.
No Scaffold ancestor could be found starting from the context that was passed to Scaffold.of(). This usually happens when the context provided is from the same StatefulWidget as that whose build function actually creates the Scaffold widget being sought.

Ainda não entendi muito bem essa parte de contexto. Segue o código da screen lista:

import 'package:bytebank/components/transferencia.dart';
import 'package:bytebank/models/transferencia.dart';
import 'package:bytebank/screens/transferencia/formulario.dart';
import 'package:flutter/material.dart';

const _tituloAppBar = 'Transferências';

class ListaTransferencias extends StatefulWidget {
  final List<Transferencia> _transferencias = List();

  @override
  State<StatefulWidget> createState() {
    return ListaTransferenciasState();
  }
}

class ListaTransferenciasState extends State<ListaTransferencias> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(_tituloAppBar),
      ),
      body: ListView.builder(
        itemCount: widget._transferencias.length,
        itemBuilder: (context, index) {
          final transferencia = widget._transferencias[index];
          return ItemTransferencia(transferencia);
        },
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          Navigator.push(context,
              MaterialPageRoute(builder: (BuildContext context) {
            return FormularioTransferencia();
          })).then((transferenciaRecebida) =>
              _atualiza(transferenciaRecebida, context));
        },
      ),
    );
  }

  void _atualiza(Transferencia transferenciaRecebida, BuildContext context) {
    if (transferenciaRecebida != null) {
      setState(() {
        widget._transferencias.add(transferenciaRecebida);
      });
      Scaffold.of(context).showSnackBar(
        SnackBar(
          content: Text('Transferência realizada com sucesso!'),
        ),
      );
    }
  }
}

O código completo está no meu github: https://github.com/anacarolinahernandes/bytebank-flutter

Alguém pode me ajudar a solucionar esta questão? Agradeço desde já!

1 resposta
solução!

Consegui resolver envolvendo o FloatingActionButton em um builder. O professor Alex explicou como fazer isso neste tópico: https://cursos.alura.com.br/forum/topico-snackbar-nao-funciona-98809.

Dessa forma, a screen lista ficou assim:

import 'package:bytebank/components/transferencia.dart';
import 'package:bytebank/models/transferencia.dart';
import 'package:bytebank/screens/transferencia/formulario.dart';
import 'package:flutter/material.dart';

const _tituloAppBar = 'Transferências';

class ListaTransferencias extends StatefulWidget {
  final List<Transferencia> _transferencias = List();

  @override
  State<StatefulWidget> createState() {
    return ListaTransferenciasState();
  }
}

class ListaTransferenciasState extends State<ListaTransferencias> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(_tituloAppBar),
      ),
      body: ListView.builder(
        itemCount: widget._transferencias.length,
        itemBuilder: (context, index) {
          final transferencia = widget._transferencias[index];
          return ItemTransferencia(transferencia);
        },
      ),
      floatingActionButton: Builder(
        builder: (context) => FloatingActionButton(
          child: Icon(Icons.add),
          onPressed: () {
            Navigator.push(context,
                MaterialPageRoute(builder: (BuildContext context) {
              return FormularioTransferencia();
            })).then((transferenciaRecebida) =>
                _atualiza(transferenciaRecebida, context));
          },
        ),
      ),
    );
  }

  void _atualiza(Transferencia transferenciaRecebida, BuildContext context) {
    if (transferenciaRecebida != null) {
      setState(() {
        widget._transferencias.add(transferenciaRecebida);
      });
      Scaffold.of(context).showSnackBar(
        SnackBar(
          content: Text('Transferência realizada com sucesso!'),
        ),
      );
    }
  }
}

Fica a ideia pra quem quiser fazer algo semelhante :)