1
resposta

[Dúvida] Inherited WIdget não atualiza a lista

Bom dia, criei uma lista e um formulario. Ambos compartilham um Inherited WIdget como o Kako mostrou, contudo updateShouldNotiffy não executa quando adiciono um elemento na lista.

class Prescricaoinherited extends InheritedWidget {
  Prescricaoinherited({
    super.key,
    required Widget child,
  }) : super(child: child);

  final List<ItemPrescricao> itemPrescricaoList = [
    ItemPrescricao(Produto("AD+", "NovaMed", "L"), 20),
  ];

  static Prescricaoinherited of(BuildContext context) {
    final Prescricaoinherited ? result = context.dependOnInheritedWidgetOfExactType<Prescricaoinherited>();
    assert(result != null, 'No  found in context');
    return result!;
  }

  @override
  bool updateShouldNotify(Prescricaoinherited oldWidget) {
    return true;
  }

  void addProduto(Produto produto, double quantidade){
 itemPrescricaoList.add(ItemPrescricao(produto, quantidade));

  }
}
1 resposta
class PrescricaoForm extends StatefulWidget {

  const PrescricaoForm({Key? key, required this.formContext}):super(key:key);
  final BuildContext formContext;
  @override
  State<StatefulWidget> createState() {
    return _PrescricaoFormState();
  }
}

class _PrescricaoFormState extends State<PrescricaoForm> {
  final _formKey = GlobalKey<FormState>();

  // Controlador para a quantidade
  final TextEditingController quantidadeTextController = TextEditingController();

  // Lista de produtos
  List<Produto> itens = [
    Produto("AD+", "Bayer", "L"),
    Produto("Iodofórmio", "Novacort", "g"),
  ];

  Produto? _produtoSelecionado;
  double _quantidade = 0.0;

  @override
  Widget build(BuildContext context) {
   
    _produtoSelecionado ??= itens.first;

    return Scaffold(
      appBar: AppBar(
        title: Text("Inserir Produto"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              // DropdownButtonFormField para selecionar produto
              DropdownButtonFormField<Produto>(
                value: _produtoSelecionado,
                items: itens.map((Produto produto) {
                  return DropdownMenuItem<Produto>(
                    value: produto,
                    child: Text(produto.nome+":"+produto.fabricante),
                  );
                }).toList(),
                decoration: InputDecoration(labelText: 'Selecione um produto'),
                onChanged: (Produto? novoProduto) {
                  setState(() {
                    _produtoSelecionado = novoProduto;
                  });
                },
                validator: (value) {
                  if (value == null) {
                    return 'Por favor, selecione um produto';
                  }
                  return null;
                },
              ),

              SizedBox(height: 16),

              // Linha com campo de quantidade e unidade de medida
              Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  // Campo de quantidade
                  Expanded(
                    child: TextFormField(
                      controller: quantidadeTextController,
                      decoration: InputDecoration(
                        labelText: 'Quantidade',
                        border: OutlineInputBorder(),
                      ),
                      keyboardType: TextInputType.number,
                      validator: (value) {
                        if (value == null || value.isEmpty) {
                          return 'Por favor, insira a quantidade';
                        }
                        if (double.tryParse(value) == null) {
                          return 'Por favor, insira um número válido';
                        }
                        return null;
                      },
                    ),
                  ),

                  SizedBox(width: 16),

                  // Texto da unidade de medida
                  Text(
                    _produtoSelecionado!.unidadeMedida,
                    style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
                  ),
                ],
              ),

              SizedBox(height: 16),

              // Botão para salvar ou retornar
              ElevatedButton(
                onPressed: () {
                  if (_formKey.currentState!.validate()) {
                    // Exibe um SnackBar com o produto e quantidade selecionados
                    Prescricaoinherited.of(widget.formContext)
                        .addProduto(_produtoSelecionado!, 12.0);//double.tryParse(quantidadeTextController.text)!);
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(
                        content: Text(
                          'Produto: ${_produtoSelecionado!.nome}, Quantidade: ${quantidadeTextController.text} ${_produtoSelecionado!.unidadeMedida}',
                        ),
                      ),
                    );

                    // Retorna para a tela anterior
                    Navigator.pop(widget.formContext);
                  }
                },
                child: Text("Salvar e Retornar"),
              ),
            ],
          ),
        ),
      ),
    );
  }
}