Vou te dar um código e depois instruções: /// Página de Chat
class ChatPage extends StatefulWidget {
  final String token;
  final String email;
  final bool iniciarNovaConversa;

  const ChatPage({
    required this.token,
    required this.email,
    this.iniciarNovaConversa = false,
  });

  @override
  _ChatPageState createState() => _ChatPageState();
}

/// Estado da Página de Chat
class _ChatPageState extends State<ChatPage> {
  String? conversaId;
  List<Message> mensagens = [];
  TextEditingController _controller = TextEditingController();
  bool podeEnviar = true;
  bool isLoading = true;

  @override
  void initState() {
    super.initState();
    if (widget.iniciarNovaConversa) {
      criarNovaConversa();
    } else {
      verificarOuCriarConversa();
    }
  }

  /// Função para verificar se já existe uma conversa ou criar uma nova
  Future<void> verificarOuCriarConversa() async {
    final url = Uri.parse(
        'https://barra.cos.ufrj.br:443/rest/conversas?email=eq.${widget.email}');
    try {
      final response = await http.get(
        url,
        headers: {
          'Authorization': 'Bearer ${widget.token}',
          'Content-Type': 'application/json',
        },
      );

      if (response.statusCode == 200) {
        List<dynamic> data = json.decode(response.body);
        if (data.isNotEmpty) {
          setState(() {
            conversaId = data.first['id'];
            mensagens = List<Message>.from(
                data.first['mensagens'].map((msg) => Message.fromJson(msg)));
            isLoading = false;
          });
        } else {
          await criarNovaConversa();
        }
      } else {
        throw Exception('Falha ao carregar conversas: ${response.statusCode}');
      }
    } catch (e) {
      setState(() {
        isLoading = false;
      });
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Erro ao carregar conversas: ${e.toString()}')),
      );
    }
  }

  /// Função para criar uma nova conversa
  Future<void> criarNovaConversa() async {
    final url = Uri.parse('https://barra.cos.ufrj.br:443/rest/rpc/cria_conversa');

    try {
      final response = await http.post(
        url,
        headers: {
          'Authorization': 'Bearer ${widget.token}',
          'Content-Type': 'application/json',
        },
      );
      
      print(response);

      if (response.statusCode == 200) {
        var data = json.decode(response.body);
        setState(() {
          conversaId = data['uuid'];
          mensagens = []; // Inicialmente vazia
          isLoading = false;
        });
        // Carregar mensagens após criar conversa, se necessário
        await carregarMensagens();
      } else {
        throw Exception('Falha ao criar conversa: ${response.statusCode}');
      }
    } catch (e) {
      setState(() {
        isLoading = false;
      });
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Erro ao criar conversa: ${e.toString()}')),
      );
    }
  }

  /// Função para carregar mensagens da conversa
  Future<void> carregarMensagens() async {
    if (conversaId == null) return;

    final url = Uri.parse(
        'https://barra.cos.ufrj.br:443/rest/conversas?id=eq.$conversaId');

    try {
      final response = await http.get(
        url,
        headers: {
          'Authorization': 'Bearer ${widget.token}',
          'Content-Type': 'application/json',
        },
      );

      if (response.statusCode == 200) {
        List<dynamic> data = json.decode(response.body);
        if (data.isNotEmpty) {
          setState(() {
            mensagens = List<Message>.from(
                data.first['mensagens'].map((msg) => Message.fromJson(msg)));
          });
        }
      } else {
        throw Exception('Falha ao carregar mensagens: ${response.statusCode}');
      }
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Erro ao carregar mensagens: ${e.toString()}')),
      );
    }
  }

  /// Função para enviar uma mensagem
  Future<void> enviarMensagem(String texto) async {
    if (!podeEnviar || conversaId == null || texto.trim().isEmpty)
      return;

    setState(() {
      podeEnviar = false;
      mensagens.add(Message(papel: 'usuario', conteudo: texto.trim()));
    });

    final url = Uri.parse('https://barra.cos.ufrj.br:443/rest/rpc/envia_resposta');

    try {
      final response = await http.post(
        url,
        headers: {
          'Authorization': 'Bearer ${widget.token}',
          'Content-Type': 'application/json',
        },
        body: json.encode({
          'conversa_id': conversaId,
          'resposta': texto.trim(),
        }),
      );

      if (response.statusCode == 200) {
        var data = json.decode(response.body);
        if (data['pergunta'] != null) {
          setState(() {
            mensagens.add(Message(papel: 'assistente', conteudo: data['pergunta']));
          });
        }
        if (data['tarefas'] != null) {
          List<String> tarefas = List<String>.from(data['tarefas']);
          if (tarefas.isNotEmpty) {
            await mostrarDialogoTarefas(tarefas);
          }
        }

        // Recarregar mensagens para garantir sincronização
        await carregarMensagens();

        setState(() {
          podeEnviar = true;
        });
      } else {
        throw Exception('Falha ao enviar resposta: ${response.statusCode}');
      }
    } catch (e) {
      setState(() {
        podeEnviar = true;
      });
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Erro ao enviar mensagem: ${e.toString()}')),
      );
    }
  }

  /// Função para mostrar diálogo após receber tarefas
  Future<void> mostrarDialogoTarefas(List<String> tarefas) async {
    return showDialog<void>(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Tarefas Geradas'),
          content: SingleChildScrollView(
            child: ListBody(
              children: tarefas.map((t) => Text(t)).toList(),
            ),
          ),
          actions: <Widget>[
            TextButton(
              child: Text('Continuar Chat'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
            TextButton(
              child: Text('Criar nova Lista'),
              onPressed: () {
                Navigator.of(context).pop();
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(
                    builder: (context) => TaskListPage(
                        token: widget.token, email: widget.email),
                  ),
                );
              },
            ),
            TextButton(
              child: Text('Adicionar à Lista Existente'),
              onPressed: () {
                // Implementar lógica para adicionar à lista existente
                // Por exemplo, navegar para TaskListPage e adicionar as tarefas
                Navigator.of(context).pop();
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => TaskListPage(
                        token: widget.token, email: widget.email),
                  ),
                );
              },
            ),
          ],
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Chat'),
      ),
      drawer: AppDrawer(token: widget.token, email: widget.email),
      body: isLoading
          ? Center(child: CircularProgressIndicator())
          : Column(
              children: [
                Expanded(
                  child: ListView.builder(
                    reverse: true, // Para manter as mensagens mais recentes na parte inferior
                    padding: EdgeInsets.all(16.0),
                    itemCount: mensagens.length,
                    itemBuilder: (context, index) {
                      final msg = mensagens[mensagens.length - 1 - index];
                      return Align(
                        alignment: msg.papel == 'usuario'
                            ? Alignment.centerRight
                            : Alignment.centerLeft,
                        child: Container(
                          padding: EdgeInsets.all(10),
                          margin: EdgeInsets.symmetric(vertical: 5),
                          decoration: BoxDecoration(
                            color: msg.papel == 'usuario'
                                ? Colors.blue[100]
                                : Colors.grey[300],
                            borderRadius: BorderRadius.circular(10),
                          ),
                          child: Text(msg.conteudo),
                        ),
                      );
                    },
                  ),
                ),
                Divider(height: 1),
                Container(
                  padding: EdgeInsets.symmetric(horizontal: 8),
                  color: Colors.white,
                  child: Row(
                    children: [
                      Expanded(
                        child: TextField(
                          controller: _controller,
                          enabled: podeEnviar,
                          decoration: InputDecoration.collapsed(
                            hintText: 'Digite sua mensagem',
                          ),
                        ),
                      ),
                      IconButton(
                        icon: Icon(Icons.send),
                        onPressed: podeEnviar
                            ? () {
                                String texto = _controller.text.trim();
                                if (texto.isNotEmpty) {
                                  enviarMensagem(texto);
                                  _controller.clear();
                                }
                              }
                            : null,
                      ),
                    ],
                  ),
                ),
              ],
            ),
    );
  }
}