Flutter-当另一个类的列表更新时,如何更新Listview小部件

时间:2019-11-09 22:45:26

标签: android listview flutter

我有一个MessageList statefulWidget,它返回一个AnimatedList(其行为与我认为的ListView类似)。 AnimatedList的内容基于存储在另一个类(Data.currentConversation.messages)中的窗口小部件列表。 我希望能够在都包含“消息”小部件列表的不同“对话”对象之间交换“ Data.currentConversation”。 交换后,我希望我的MessageList小部件能够更新。

import 'package:flutter/material.dart';
import 'Data.dart';

class MessagesList extends StatefulWidget {
  @override
  MessagesListState createState() => MessagesListState();
}

class MessagesListState extends State<MessagesList> {

  ScrollController _scrollController = ScrollController();

  void initState() {
    super.initState();
    _scrollController = ScrollController();
  }

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }

  scrollToBottom() {
    _scrollController.animateTo(_scrollController.position.maxScrollExtent,
        duration: Duration(milliseconds: 200), curve: Curves.easeOut);
  }


  Widget build(BuildContext context) {
    return AnimatedList(
      //reverse: true,
        key: Data.listKey,
        controller: _scrollController,
        initialItemCount: Data.currentConversation.messages.length * 2,
        itemBuilder: (context, i, animation) {
          if (i.isOdd)
            return Divider(height: 1, thickness: 1, color: Colors.white70,);

          final index = i ~/ 2;

          return Data.currentConversation.messages[index];
        }
    );
  }
  }

这是我的MessagesList类。 我的数据类仅包含一堆静态变量。 我想从另一个类触发ListView的完整更新:


import 'Conversation.dart';
import 'Data.dart';
import 'GlobalUser.dart';

class ConversationController {

  static switchToPrivateConversation({GlobalUser user}) {

    if (user != null) {
      if (user.privateConversation == null) {
        Conversation conversation = new Conversation(title: user.name,
            isOffline: true,
            user: user); //TODO : change this when online will be implemented
        user.privateConversation = conversation;
        Data.conversations.add(conversation);
      }

      // The code to refresh the listView should be here

      Data.currentConversation = user.privateConversation;
    }
    else {
      throw new Exception('ERROR : Tried to switch to private conversation without giving a user as a parameter');
    }
  }
}

我不知道该怎么做。

我尝试将AnimatedList存储在MessagesList类的变量中,并在setState()方法中对其进行操作,然后从那里进行处理,我能够刷新一些内容,但是itemCount总是错误的,并且我遇到了很多错误,因为新的Data.currentConversation.messages包含的元素比上一个要少。

我想我不了解颤振及其运作原理,我不知道...

0 个答案:

没有答案