我有一种方法可以从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,但最终显示了很多微调框,或者根本没有显示任何内容。
我尝试了很多选择,现在我不知道还能做什么。 谢谢大家。