Странное поведение ListView, которое находится под трепетом TabBarView - PullRequest
0 голосов
/ 01 февраля 2019

Я делаю приложение, которое выглядит как клон 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

gif

Я такжедобавление кода для компонента 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...