具有动态数据时的分页

时间:2019-09-06 14:40:09

标签: sqlite flutter dart

我有一种方法可以从SQLite的页面中获取数据并在屏幕上显示它们。 功能如下:

static Future<List<Message>> getPaginatedConversationMessages(
      int conversation_id) async {
    List<Message> _messages = [];
    final db = await DBHelper.database();
    final dataList = Provider.of<MainModel>(navigatorKey.currentContext)
                .lastValueOfPage ==
            0
        ? await db.rawQuery(
            'SELECT * FROM message WHERE conversation_id = ? ORDER BY external_id DESC LIMIT 40',
            [
                conversation_id
              ])
        : await db.rawQuery(
            'SELECT * FROM message WHERE conversation_id = ? AND external_id < ? ORDER BY external_id DESC LIMIT 40',
            [
                conversation_id,
                Provider.of<MainModel>(navigatorKey.currentContext)
                    .lastValueOfPage
              ]);
    _messages = dataList != null
        ? await dataList.map((data) => Message.fromDatabaseJson(data)).toList()
        : [];
    Provider.of<MainModel>(navigatorKey.currentContext).lastValueOfPage =
        _messages.last.externalId;
    return _messages;
  }

在数据库中,我检查最后一个值是否为零,是否得到40条最后一条消息,然后将lastValue的值更改为页面的第一个元素。

然后我要在屏幕上呈现这些消息,我正在使用此程序包:

dependencies:
  paging: ^0.1.0 

当我滚动列表时,它可以很好地呈现列表。 但是问题是我正在将它用于实时聊天消息。而且,当我发送或接收消息时,并不能使用我尝试的所有方法来渲染屏幕。我在提交一条消息时尝试将其追加到它得到的列表中,但是它不起作用。

这是屏幕代码:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:paging/paging.dart';
import 'package:provider/provider.dart';

class ConversationMessage extends StatefulWidget {
  final Conversation conversation;
  ConversationMessage({this.conversation});

  @override
  State<StatefulWidget> createState() {
    return _ConversationMessageState();
  }
}

class _ConversationMessageState extends State<ConversationMessage> {
  List<Message> messages = List();
  ScrollController _controller;

  _scrollListener() {
    if (_controller.offset <= _controller.position.minScrollExtent &&
        !_controller.position.outOfRange) {
      setState(() {
        Provider.of<MainModel>(context).pageNumber = 0;
      });
    }
  }

  @override
  void initState() {
    _controller = ScrollController();
    _controller.addListener(_scrollListener);
    super.initState();
  }


  Widget _buildMessageFields(int index, Message message, MainModel model) {
      return Column(
              children: <Widget>[
                Container(
                  child: Text(
                    '${message.messageBody}',
                  ),
                )
              ],
            )  
      );
  }

  Future<List<Message>> pageData(int previousCount) async {
    await Future.delayed(Duration(seconds: 0, milliseconds: 500));
    await Provider.of<MainModel>(context)
        .getPaginatedConversationMessages(widget.conversation.externalId)
        .then((list) {
      setState(() {
        Provider.of<MainModel>(context).paginatedMessages = list;
      });
    });
    return Provider.of<MainModel>(context).paginatedMessages;
  }

  @override
  Widget build(BuildContext context) {
    MainModel model = Provider.of<MainModel>(context);
    return Pagination<Message>(
        pageBuilder: (currentSize) => pageData(currentSize),
        reverse: true,
        itemBuilder: (index, item) {
          return Container(
            child: _buildMessageFields(index, item, model),
          );
        });
  }
}

因此,我尝试在数据获取前40行时将其设置为零,而对于其他行,则尝试将其设置为-1,并在用户单击发送消息时插入一行,并且我还尝试了重置该值和所有但我只是搞砸了,什么都没做。

Future _handleSubmit(String text, BuildContext context) async {
  _messageController.clear();
  MainModel model = Provider.of<MainModel>(context);
  if (text.length > 0) {
    final internalId = await DBHelper.insert('message', {
      'sender_id': model.authenticatedUser.id,
      'conversation_id': widget.conversation.externalId,
      'message_body': text,
      'created_at': new DateTime.now().millisecondsSinceEpoch
    });
    if (model.pageNumber == 0) {
      Message message = await DBHelper.getMessage(internalId);
      setState(() {
        Provider.of<MainModel>(context).paginatedMessages.insert(0, message);
      });
    }
  } else
    return;
}

我尝试使用StreamBuilder,但最终显示了很多微调框,或者根本没有显示任何内容。

我尝试了很多选择,现在我不知道还能做什么。 谢谢大家。

0 个答案:

没有答案