Как обновить состояние 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,
),
);
}
},
);
}
}```