Как обновить состояние ListView, если список изменяется в другом виджете?

Никак не могу понять, что мне нужно сделать, чтобы обновить состояние ListView.

Вот есть следующий код. floatingActionButton: ComposeButton(future), Здесь добавляется элемент в список, причем данные видно в MessageList, если вывести список, то в нем есть новые элементы но ListView не меняется состояние, потому что новый элемент в приложении не отображается

Я уже пытался передавать 2 списка в composebutton менять там состояние. Не помогло

Подскажите, что я могу сделать?

PS. Весь проект тут, если понадобится протестировать у себя

MessageList.dart - запускается в main

import 'package:email_clinet/ComposeButton.dart';
import 'package:email_clinet/Message.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

import 'MesageDeatail.dart';

class MessagesList extends StatefulWidget {
  final String title;
  const MessagesList({Key key, this.title}) : super(key: key);

  @override
  State<StatefulWidget> createState() => _MessagesListState();
}

class _MessagesListState extends State<MessagesList> {
  Future<List<Message>> future;
  List<Message> messages = [];

  initState() {
    super.initState();
    fetch();
  }

  void fetch() async {
    future = Message.browse();
    messages = await future;
  }

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: [
          IconButton(
              icon: Icon(Icons.refresh_sharp),
              onPressed: () async {
                future = Message.browse();
                var _messages = await future;
                setState(() {
                  messages = _messages;
                });
              })
        ],
      ),
      body: FutureBuilder(
        future: future,
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          switch (snapshot.connectionState) {
            case ConnectionState.none:
            case ConnectionState.waiting:
            case ConnectionState.active:
              return Center(child: CircularProgressIndicator());
            case ConnectionState.done:
              if (snapshot.hasError)
                return Text("There was an error: ${snapshot.error}");
              var messages = snapshot.data;

              return ListView.separated(
                key: Key(messages.length.toString()),
                separatorBuilder: (context, index) => Divider(),
                itemCount: messages.length,
                itemBuilder: (BuildContext context, int index) {
                  Message message = messages[index];
                  return ListTile(
                    title: Text(message.subject),
                    isThreeLine: true,
                    leading: CircleAvatar(
                      child: Text("PJ"),
                      backgroundColor: Colors.red[500],
                      foregroundColor: Colors.black,
                    ),
                    subtitle: Text(
                      message.body,
                      maxLines: 2,
                      overflow: TextOverflow.ellipsis,
                    ),
                    onTap: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (BuildContext context) =>
                              MessageDeatail(message.subject, message.body),
                        ),
                      );
                    },
                  );
                },
              );
          }
        },
      ),
      floatingActionButton: ComposeButton(future), // <-- Вот тут изменяется состояние списка
    );
  }
}

ComposeButton.dart

import 'package:flutter/material.dart';
import 'Message.dart';
import 'MessageCompose.dart';

class ComposeButton extends StatelessWidget {
  final Future future;
  ComposeButton([this.future]);
  List<Message> messages;
  List<Message> get getMessages => messages;

  @override
  Widget build(BuildContext context) {
    return FloatingActionButton(
      child: Icon(Icons.add),
      onPressed: () async {
        Message message = await Navigator.push(
          context,
          MaterialPageRoute(
            builder: (BuildContext context) => MessageCompose(),
          ),
        );

        if (message != null) {
          messages = await future;

          messages.add(message);

          Scaffold.of(context).showSnackBar(
            SnackBar(
              content: Text(
                "Your message has been sent",
                style: TextStyle(color: Colors.black),
              ),
              backgroundColor: Colors.grey,
            ),
          );
        }
      },
    );
  }
}```

Ответы (0 шт):