check null safety

This commit is contained in:
tzw
2021-09-10 16:33:52 +06:30
parent 3eacbef117
commit d8c86a512b
46 changed files with 275 additions and 304 deletions

View File

@@ -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!();
}
}

View File

@@ -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,

View File

@@ -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: