check null safety
This commit is contained in:
@@ -2,7 +2,6 @@ import 'package:fcs/helpers/theme.dart';
|
||||
import 'package:fcs/pages/package/package_info.dart';
|
||||
import 'package:fcs/pages/main/util.dart';
|
||||
import 'package:fcs/pages/widgets/fcs_id_icon.dart';
|
||||
import 'package:fcs/pages/widgets/local_text.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
@@ -14,18 +13,18 @@ typedef CallbackOnViewDetail();
|
||||
class Bubble extends StatelessWidget {
|
||||
Bubble(
|
||||
{this.message,
|
||||
this.date,
|
||||
this.delivered,
|
||||
this.isMine,
|
||||
required this.date,
|
||||
required this.delivered,
|
||||
required this.isMine,
|
||||
this.sender,
|
||||
this.isSystem,
|
||||
this.isCustomer,
|
||||
this.showDate,
|
||||
required this.isSystem,
|
||||
required this.isCustomer,
|
||||
required this.showDate,
|
||||
this.callbackOnViewDetail});
|
||||
|
||||
final CallbackOnViewDetail callbackOnViewDetail;
|
||||
final CallbackOnViewDetail? callbackOnViewDetail;
|
||||
final DateTime date;
|
||||
final String message, sender;
|
||||
final String? message, sender;
|
||||
final bool delivered, isMine, isSystem, isCustomer, showDate;
|
||||
|
||||
@override
|
||||
@@ -84,7 +83,7 @@ class Bubble extends StatelessWidget {
|
||||
fontWeight: FontWeight.bold)))
|
||||
]
|
||||
: [
|
||||
Text(isCustomer ? "FCS Team" : sender,
|
||||
Text(isCustomer ? "FCS Team" : sender ?? "",
|
||||
style: TextStyle(
|
||||
color: Colors.black38,
|
||||
fontSize: 10.0,
|
||||
@@ -102,8 +101,8 @@ class Bubble extends StatelessWidget {
|
||||
children: <Widget>[
|
||||
Padding(
|
||||
padding: EdgeInsets.only(right: 48.0),
|
||||
child: Text(message,
|
||||
style: hasUnicode(message)
|
||||
child: Text(message ?? "",
|
||||
style: hasUnicode(message ?? "")
|
||||
? newLabelStyleMM(color: primaryColor)
|
||||
: newLabelStyle(color: primaryColor))),
|
||||
Positioned(
|
||||
@@ -130,6 +129,6 @@ class Bubble extends StatelessWidget {
|
||||
}
|
||||
|
||||
_viewDetail() {
|
||||
if (callbackOnViewDetail != null) callbackOnViewDetail();
|
||||
if (callbackOnViewDetail != null) callbackOnViewDetail!();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,14 +21,17 @@ import 'package:provider/provider.dart';
|
||||
import 'bubble.dart';
|
||||
|
||||
class MessageDetail extends StatelessWidget {
|
||||
final String receiverName;
|
||||
final String receiverID;
|
||||
final String? receiverName;
|
||||
final String? receiverID;
|
||||
final MessageModel messageModel;
|
||||
final TextEditingController textEditingController = TextEditingController();
|
||||
final ScrollController listScrollController = ScrollController();
|
||||
|
||||
MessageDetail(
|
||||
{Key key, this.messageModel, this.receiverName, this.receiverID})
|
||||
{Key? key,
|
||||
required this.messageModel,
|
||||
this.receiverName,
|
||||
this.receiverID})
|
||||
: super(key: key) {
|
||||
listScrollController.addListener(() {
|
||||
if (listScrollController.offset >=
|
||||
@@ -44,7 +47,7 @@ class MessageDetail extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
String userID = Provider.of<MessageModel>(context).user.id;
|
||||
String userID = Provider.of<MessageModel>(context).user?.id ?? "";
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
@@ -96,8 +99,8 @@ class MessageDetail extends StatelessWidget {
|
||||
Widget buildBubble(Message msg, String userID, bool showDate,
|
||||
CallbackOnViewDetail callback) {
|
||||
return Bubble(
|
||||
message: msg.message,
|
||||
date: msg.date,
|
||||
message: msg.message ?? "",
|
||||
date: msg.date!,
|
||||
delivered: true,
|
||||
sender: msg.senderName,
|
||||
isMine: msg.senderID == userID || msg.receiverID == receiverID,
|
||||
@@ -117,8 +120,8 @@ class MessageDetail extends StatelessWidget {
|
||||
child: Container(
|
||||
child: TextField(
|
||||
onSubmitted: (value) {
|
||||
Provider.of<MessageModel>(context, listen: false)
|
||||
.sendMessage(textEditingController.text, receiverID);
|
||||
Provider.of<MessageModel>(context, listen: false).sendMessage(
|
||||
textEditingController.text, receiverID ?? "");
|
||||
textEditingController.text = "";
|
||||
},
|
||||
style: TextStyle(color: primaryColor, fontSize: 15.0),
|
||||
@@ -152,8 +155,8 @@ class MessageDetail extends StatelessWidget {
|
||||
child: IconButton(
|
||||
icon: Icon(Icons.send),
|
||||
onPressed: () {
|
||||
Provider.of<MessageModel>(context, listen: false)
|
||||
.sendMessage(textEditingController.text, receiverID);
|
||||
Provider.of<MessageModel>(context, listen: false).sendMessage(
|
||||
textEditingController.text, receiverID ?? "");
|
||||
textEditingController.text = "";
|
||||
},
|
||||
color: primaryColor,
|
||||
@@ -165,7 +168,8 @@ class MessageDetail extends StatelessWidget {
|
||||
),
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
border: Border(top: BorderSide(color: Colors.grey[700], width: 0.5)),
|
||||
border:
|
||||
Border(top: BorderSide(color: Colors.grey.shade700, width: 0.5)),
|
||||
color: Colors.white),
|
||||
);
|
||||
}
|
||||
@@ -176,7 +180,7 @@ class MessageDetail extends StatelessWidget {
|
||||
message.messageID != "") {
|
||||
PackageModel packageModel =
|
||||
Provider.of<PackageModel>(context, listen: false);
|
||||
Package p = await packageModel.getPackage(message.messageID);
|
||||
Package p = await packageModel.getPackage(message.messageID!);
|
||||
if (p == null) return;
|
||||
Navigator.push<bool>(context,
|
||||
CupertinoPageRoute(builder: (context) => PackageInfo(package: p)));
|
||||
@@ -186,7 +190,7 @@ class MessageDetail extends StatelessWidget {
|
||||
message.messageID != "") {
|
||||
MainModel mainModel = Provider.of<MainModel>(context, listen: false);
|
||||
|
||||
if (mainModel.user.isCustomer()) {
|
||||
if (mainModel.user?.isCustomer() ?? false) {
|
||||
Navigator.push<bool>(
|
||||
context, CupertinoPageRoute(builder: (context) => Profile()));
|
||||
} else {
|
||||
@@ -202,7 +206,7 @@ class MessageDetail extends StatelessWidget {
|
||||
message.messageID != "") {
|
||||
ShipmentModel shipmentModel =
|
||||
Provider.of<ShipmentModel>(context, listen: false);
|
||||
Shipment s = await shipmentModel.getShipment(message.messageID);
|
||||
Shipment s = await shipmentModel.getShipment(message.messageID!);
|
||||
if (s == null) return;
|
||||
await Navigator.push<bool>(
|
||||
context,
|
||||
|
||||
@@ -10,45 +10,46 @@ import 'package:logging/logging.dart';
|
||||
class MessageModel extends BaseModel {
|
||||
final log = Logger('MessageModel');
|
||||
|
||||
List<Message> messages;
|
||||
List<Message> messages = [];
|
||||
|
||||
@override
|
||||
logout() async {
|
||||
if (listener != null) await listener.cancel();
|
||||
if (listener != null) await listener!.cancel();
|
||||
messages = [];
|
||||
}
|
||||
|
||||
Query query;
|
||||
DocumentSnapshot prevSnap;
|
||||
bool isEnded;
|
||||
bool isLoading;
|
||||
String userID;
|
||||
StreamSubscription<QuerySnapshot> listener;
|
||||
late Query query;
|
||||
DocumentSnapshot? prevSnap;
|
||||
late bool isEnded;
|
||||
late bool isLoading;
|
||||
String? userID;
|
||||
StreamSubscription<QuerySnapshot>? listener;
|
||||
|
||||
static const int rowPerLoad = 20;
|
||||
void initQuery(String? userID) {
|
||||
if(userID == null)return;
|
||||
if (userID == null) return;
|
||||
this.messages = [];
|
||||
this.userID = userID;
|
||||
this.prevSnap = null;
|
||||
query = Firestore.instance
|
||||
query = FirebaseFirestore.instance
|
||||
.collection("$user_collection/$userID/$messages_collection")
|
||||
.orderBy('date', descending: true);
|
||||
load();
|
||||
}
|
||||
|
||||
Future<void> load() async {
|
||||
if (prevSnap == null) return;
|
||||
Query _query =
|
||||
prevSnap != null ? query.startAfterDocument(prevSnap) : query;
|
||||
prevSnap != null ? query.startAfterDocument(prevSnap!) : query;
|
||||
QuerySnapshot snapshot =
|
||||
await _query.limit(rowPerLoad).getDocuments(source: Source.server);
|
||||
await _query.limit(rowPerLoad).get(GetOptions(source: Source.server));
|
||||
|
||||
int count = snapshot.documents.length;
|
||||
int count = snapshot.docs.length;
|
||||
isEnded = count < rowPerLoad;
|
||||
prevSnap = count > 0 ? snapshot.documents[count - 1] : prevSnap;
|
||||
prevSnap = count > 0 ? snapshot.docs[count - 1] : prevSnap;
|
||||
|
||||
snapshot.documents.forEach((e) {
|
||||
messages.add(Message.fromMap(e.data, e.documentID));
|
||||
snapshot.docs.forEach((e) {
|
||||
messages.add(Message.fromMap(e.data() as Map<String, dynamic>, e.id));
|
||||
if (messages.length == 1) {
|
||||
_initListener(e);
|
||||
}
|
||||
@@ -57,20 +58,22 @@ class MessageModel extends BaseModel {
|
||||
}
|
||||
|
||||
void _initListener(DocumentSnapshot snap) {
|
||||
if (listener != null) listener.cancel();
|
||||
if (listener != null) listener!.cancel();
|
||||
|
||||
listener = Firestore.instance
|
||||
listener = FirebaseFirestore.instance
|
||||
.collection("$user_collection/$userID/$messages_collection")
|
||||
.endBeforeDocument(snap)
|
||||
.orderBy('date', descending: true)
|
||||
.snapshots(includeMetadataChanges: true)
|
||||
.listen((qs) {
|
||||
qs.documentChanges.forEach((c) {
|
||||
qs.docChanges.forEach((c) {
|
||||
switch (c.type) {
|
||||
case DocumentChangeType.added:
|
||||
log.info("added!! $c");
|
||||
messages.insert(
|
||||
0, Message.fromMap(c.document.data, c.document.documentID));
|
||||
0,
|
||||
Message.fromMap(
|
||||
c.doc.data() as Map<String, dynamic>, c.doc.id));
|
||||
notifyListeners();
|
||||
break;
|
||||
case DocumentChangeType.modified:
|
||||
|
||||
Reference in New Issue
Block a user