Я делаю приложение, которое выглядит как клон WhatsApp, у него есть 3 вкладки, которые содержат различные ListViews и другие виджеты.Итак, первая вкладка - это ListView
, которая отображает список всех чатов пользователя.У меня есть функция чата, работающая корректно с firestore.
Дочерний элемент первого TabBarView
- это ListView
, который отображает эскизы, имена и последние сообщения для всех пользователей.Проблема в том, что виджет корректно загружает данные из магазина.По какой-то причине ListView пуст.Я уверен, что он имеет все правильные данные.Когда я переключаю вкладки и возвращаюсь к первой вкладке, ListView
показывает чаты только на секунду, затем он исчезает.Я понятия не имею, почему это происходит, пожалуйста, помогите!
Вот виджет ListView
, который отображает чаты:
import 'package:classroom_app/Services/app_state.dart';
import 'package:classroom_app/Services/app_events.dart';
import 'package:classroom_app/Widgets/classroom_app.dart';
import 'package:flutter/material.dart';
class ChatList extends StatefulWidget {
final String userId;
ChatList(@required this.userId);
@override
_ChatListState createState() => _ChatListState();
}
class _ChatListState extends State<ChatList> {
Widget buildRow(BuildContext context, ChatItem chat) {
return Row(
children: <Widget>[
Container(
height: 100.0,
width: 100.0,
child: ClipOval(
child: Image.network(
chat.photoUrl,
fit: BoxFit.cover,
),
),
padding: EdgeInsets.all(12.0),
),
Column(
children: <Widget>[
Text(
chat.userName,
style: TextStyle(fontSize: 15.0),
),
/*Text(chat.displayMessage,
style: TextStyle(fontSize: 8.0, color: Colors.grey)),*/
],
),
/*Text(
chat.unseenCount.toString(),
style: TextStyle(color: Colors.white, background: Paint()),
),*/
],
);
}
@override
void didUpdateWidget(Widget oldWidget) {
print(ClassroomApp.of(context).chat.currentState.listOfUserChats.toString());
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
ClassroomApp.of(context).chat.dispatch(GetAllConversations(widget.userId));
return StreamBuilder(
stream: ClassroomApp.of(context).chat.state,
builder: (context, snapshot) {
if(snapshot.hasData) {
if(snapshot.data.listOfUserChats == [] || snapshot.data.listOfUserChats == null) {
return Center(child: Text('You don\'t have any chats. Try adding a Classmate.'),);
} else {
return ListView.builder(
itemBuilder: (context, index) => buildRow(context, snapshot.data.listOfUserChats[index]),
itemCount: snapshot.data.listOfUserChats.length,
);
}
} else {
return Center(child: CircularProgressIndicator(),);
}
},
);
}
}
А вот виджет моей домашней страницы, который содержит TabBarView
.
import 'package:classroom_app/Services/app_state.dart';
import 'package:classroom_app/Widgets/chat_list.dart';
import 'package:classroom_app/Widgets/classroom_app.dart';
import 'package:classroom_app/Services/app_events.dart';
import 'package:flutter/material.dart';
enum UserOptions { AddClassmate, Settings, SignOut }
class HomePage extends StatefulWidget {
HomePage({Key key, @required this.title, @required this.userAuth})
: super(key: key);
final String title;
final AuthenticationState userAuth;
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage>
with SingleTickerProviderStateMixin {
final List<Tab> appBarTabs = [
Tab(text: 'CHATS'),
Tab(text: 'LECTURES'),
Tab(text: 'DOUBTS'),
];
String _userName;
TabController _tabController;
TextEditingController _editingController;
@override
void initState() {
_tabController = TabController(vsync: this, length: appBarTabs.length);
_editingController = TextEditingController();
super.initState();
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
widget.title,
style: TextStyle(fontSize: 25, color: Colors.
bottom: TabBar(
labelColor: Colors.white,
controller: _tabController,
tabs: appBarTabs,
isScrollable: false,
),
),
body: TabBarView(
controller: _tabController,
children: <Widget>[
Container(
child: ChatList(widget.userAuth.user.uid),
),
Center(child: Text('This is lectures view.')),
Center(child: Text('This is doubts view.')),
],
),
);
}
}
Я добавил GIF, чтобы показать поведение ListView
Я такжедобавление кода для компонента chatBloc
, а также ClassroomApp
InheritedWidget
class ChatBloc extends Bloc<ChatEvent, ChatState> {
final ChatService _chatService = ChatService();
@override
ChatState get initialState => ChatState(null, null);
@override
Stream<ChatState> mapEventToState(
ChatState currentState, ChatEvent event) async* {
if (event is StartConversation) {
_chatService.startNewConversation(event.senderId, event.recieverName);
yield ChatState(
await _chatService.getAllMessagesByUserId(event.senderId), null);
}
if (event is GetAllConversations) {
List<ChatItem> chatList =
await _chatService.getAllMessagesByUserId(event.userId);
yield ChatState(chatList, null);
}
}
}
ClassroomApp InheritedWidget:
import 'package:flutter/material.dart';
import 'package:classroom_app/Services/bloc_serviec.dart';
class ClassroomApp extends InheritedWidget {
final AuthBloc auth = AuthBloc();
final ChatBloc chat = ChatBloc();
ClassroomApp({Widget child}) : super(child: child);
@override
bool updateShouldNotify(InheritedWidget oldWidget) => true;
static ClassroomApp of(BuildContext context) =>
context.inheritFromWidgetOfExactType(ClassroomApp);
}