1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2025-06-19 08:15:16 +00:00

Start to fix null safety migration errors

This commit is contained in:
2022-03-10 19:39:57 +01:00
parent ab2c5da0da
commit 3a997cdc56
258 changed files with 2879 additions and 2912 deletions

View File

@ -1,4 +1,4 @@
import 'package:flutter/widgets.dart';
/// Account image settings
///
@ -7,14 +7,14 @@ import 'package:flutter/widgets.dart';
enum AccountImageVisibilityLevels { EVERYONE, COMUNIC_USERS, FRIENDS_ONLY }
class AccountImageSettings {
final bool/*!*/ hasImage;
final String/*!*/ imageURL;
final AccountImageVisibilityLevels/*!*/ visibility;
final bool hasImage;
final String imageURL;
final AccountImageVisibilityLevels visibility;
const AccountImageSettings({
@required this.hasImage,
@required this.imageURL,
@required this.visibility,
required this.hasImage,
required this.imageURL,
required this.visibility,
}) : assert(hasImage != null),
assert(imageURL != null),
assert(visibility != null);

View File

@ -1,7 +1,6 @@
import 'package:comunic/enums/likes_type.dart';
import 'package:comunic/models/conversation.dart';
import 'package:comunic/models/like_element.dart';
import 'package:flutter/material.dart';
import 'group.dart';
@ -10,34 +9,34 @@ import 'group.dart';
/// @author Pierre Hubert
class AdvancedGroupInfo extends Group implements LikeElement {
bool isMembersListPublic;
final int timeCreate;
bool? isMembersListPublic;
final int? timeCreate;
String description;
String url;
int likes;
bool userLike;
List<Conversation> conversations;
bool/*!*/ isForezGroup;
List<Conversation>? conversations;
bool isForezGroup;
AdvancedGroupInfo({
@required int id,
@required String name,
@required String iconURL,
@required int numberMembers,
@required GroupMembershipLevel membershipLevel,
@required GroupVisibilityLevel visibilityLevel,
@required GroupRegistrationLevel registrationLevel,
@required GroupPostCreationLevel postCreationLevel,
@required String virtualDirectory,
@required bool following,
@required this.isMembersListPublic,
@required this.timeCreate,
@required this.description,
@required this.url,
@required this.likes,
@required this.userLike,
@required this.conversations,
@required this.isForezGroup,
required int id,
required String name,
required String iconURL,
required int numberMembers,
required GroupMembershipLevel membershipLevel,
required GroupVisibilityLevel visibilityLevel,
required GroupRegistrationLevel registrationLevel,
required GroupPostCreationLevel postCreationLevel,
required String virtualDirectory,
required bool following,
required this.isMembersListPublic,
required this.timeCreate,
required this.description,
required this.url,
required this.likes,
required this.userLike,
required this.conversations,
required this.isForezGroup,
}) : assert(isForezGroup != null),
super(
id: id,

View File

@ -3,42 +3,41 @@ import 'package:comunic/enums/user_page_visibility.dart';
import 'package:comunic/lists/custom_emojies_list.dart';
import 'package:comunic/models/like_element.dart';
import 'package:comunic/models/user.dart';
import 'package:meta/meta.dart';
/// Advanced user information
///
/// @author Pierre HUBERT
class AdvancedUserInfo extends User implements LikeElement {
final String emailAddress;
final String/*!*/ publicNote;
final bool/*!*/ canPostTexts;
final bool/*!*/ isFriendsListPublic;
final int/*!*/ numberFriends;
final int/*!*/ accountCreationTime;
final String/*!*/ personalWebsite;
final String location;
bool/*!*/ userLike;
int/*!*/ likes;
final String? emailAddress;
final String publicNote;
final bool canPostTexts;
final bool isFriendsListPublic;
final int numberFriends;
final int accountCreationTime;
final String personalWebsite;
final String? location;
bool userLike;
int likes;
AdvancedUserInfo({
@required int id,
@required String firstName,
@required String lastName,
@required UserPageVisibility pageVisibility,
@required String virtualDirectory,
@required String accountImageURL,
@required CustomEmojiesList customEmojies,
@required this.emailAddress,
@required this.publicNote,
@required this.canPostTexts,
@required this.isFriendsListPublic,
@required this.numberFriends,
@required this.accountCreationTime,
@required this.personalWebsite,
@required this.location,
@required this.userLike,
@required this.likes,
required int id,
required String firstName,
required String lastName,
required UserPageVisibility pageVisibility,
required String? virtualDirectory,
required String accountImageURL,
required CustomEmojiesList customEmojies,
required this.emailAddress,
required this.publicNote,
required this.canPostTexts,
required this.isFriendsListPublic,
required this.numberFriends,
required this.accountCreationTime,
required this.personalWebsite,
required this.location,
required this.userLike,
required this.likes,
}) : assert(publicNote != null),
assert(canPostTexts != null),
assert(isFriendsListPublic != null),
@ -60,9 +59,9 @@ class AdvancedUserInfo extends User implements LikeElement {
bool get hasPersonalWebsite => personalWebsite.isNotEmpty;
bool get hasEmailAddress => emailAddress != null && emailAddress.isNotEmpty;
bool get hasEmailAddress => emailAddress != null && emailAddress!.isNotEmpty;
bool get hasLocation => location != null && location.isNotEmpty;
bool get hasLocation => location != null && location!.isNotEmpty;
@override
LikesType get likeType => LikesType.USER;

View File

@ -4,7 +4,6 @@ import 'package:comunic/helpers/api_helper.dart';
import 'package:comunic/models/api_response.dart';
import 'package:dio/dio.dart';
import 'package:http_parser/http_parser.dart';
import 'package:meta/meta.dart';
/// API Request model
///
@ -14,8 +13,8 @@ import 'package:meta/meta.dart';
class BytesFile {
final String filename;
final List<int> bytes;
final MediaType type;
final List<int>? bytes;
final MediaType? type;
const BytesFile(
this.filename,
@ -25,15 +24,15 @@ class BytesFile {
}
class APIRequest {
final String/*!*/ uri;
final bool/*!*/ needLogin;
ProgressCallback progressCallback;
CancelToken cancelToken;
Map<String, String> args;
final String uri;
final bool needLogin;
ProgressCallback? progressCallback;
CancelToken? cancelToken;
Map<String, String?>? args;
Map<String, File> files = Map();
Map<String, BytesFile> bytesFiles = Map();
Map<String, BytesFile?> bytesFiles = Map();
APIRequest({@required this.uri, this.needLogin = false, this.args})
APIRequest({required this.uri, this.needLogin = false, this.args})
: assert(uri != null),
assert(needLogin != null) {
if (this.args == null) this.args = Map();
@ -51,18 +50,18 @@ class APIRequest {
if (args == null) this.args = Map();
}
APIRequest addString(String name, String value) {
args[name] = value;
APIRequest addString(String name, String? value) {
args![name] = value;
return this;
}
APIRequest addInt(String name, int value) {
args[name] = value.toString();
APIRequest addInt(String name, int? value) {
args![name] = value.toString();
return this;
}
APIRequest addBool(String name, bool value) {
args[name] = value ? "true" : "false";
args![name] = value ? "true" : "false";
return this;
}
@ -71,12 +70,12 @@ class APIRequest {
return this;
}
APIRequest addBytesFile(String name, BytesFile file) {
APIRequest addBytesFile(String name, BytesFile? file) {
this.bytesFiles[name] = file;
return this;
}
void addArgs(Map<String, String> newArgs) => args.addAll(newArgs);
void addArgs(Map<String, String> newArgs) => args!.addAll(newArgs);
/// Execute the request
Future<APIResponse> exec() async => APIHelper().exec(this);

View File

@ -5,14 +5,14 @@ import 'dart:convert';
/// @author Pierre HUBERT
class APIResponse {
final int/*!*/ code;
final String content;
final int code;
final String? content;
const APIResponse(this.code, this.content) : assert(code != null);
const APIResponse(this.code, this.content);
List<dynamic> getArray() => jsonDecode(this.content);
List<dynamic>? getArray() => jsonDecode(this.content!);
Map<String, dynamic> getObject() => jsonDecode(this.content);
Map<String, dynamic> getObject() => jsonDecode(this.content!);
/// Check if the request is successful or not
bool get isOK => code == 200;

View File

@ -1,18 +1,18 @@
import 'package:flutter/cupertino.dart';
/// Application settings
///
/// @author Pierre Hubert
class ApplicationPreferences {
bool/*!*/ enableDarkMode;
bool/*!*/ forceMobileMode;
bool/*!*/ showPerformancesOverlay;
bool enableDarkMode;
bool forceMobileMode;
bool showPerformancesOverlay;
ApplicationPreferences({
@required this.enableDarkMode,
@required this.forceMobileMode,
@required this.showPerformancesOverlay,
required this.enableDarkMode,
required this.forceMobileMode,
required this.showPerformancesOverlay,
}) : assert(enableDarkMode != null),
assert(forceMobileMode != null),
assert(showPerformancesOverlay != null);

View File

@ -1,14 +1,14 @@
import 'package:meta/meta.dart';
/// Authentication details
///
/// @author Pierre HUBERT
class AuthenticationDetails {
final String/*!*/ email;
final String/*!*/ password;
final String email;
final String password;
const AuthenticationDetails({@required this.email, @required this.password})
const AuthenticationDetails({required this.email, required this.password})
: assert(email != null),
assert(password != null);
}

View File

@ -1,14 +1,13 @@
import 'package:comunic/helpers/database/database_contract.dart';
import 'package:meta/meta.dart';
/// Cache base model
///
/// @author Pierre HUBERT
abstract class CacheModel {
final int/*!*/ id;
final int id;
const CacheModel({@required this.id}) : assert(id != null);
const CacheModel({required this.id}) : assert(id != null);
/// Initialize a CacheModel from a map
CacheModel.fromMap(Map<String, dynamic> map)

View File

@ -1,14 +1,14 @@
import 'package:flutter/material.dart';
/// Call configuration
///
/// @author Pierre Hubert
class CallConfig {
final List<String>/*!*/ iceServers;
final List<String> iceServers;
const CallConfig({
@required this.iceServers,
required this.iceServers,
}) : assert(iceServers != null);
/// Turn this call configuration into the right for the WebRTC plugin

View File

@ -1,4 +1,3 @@
import 'package:flutter/material.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart';
/// Single call member information
@ -8,16 +7,16 @@ import 'package:flutter_webrtc/flutter_webrtc.dart';
enum MemberStatus { JOINED, READY }
class CallMember {
final int/*!*/ userID;
MemberStatus/*!*/ status;
MediaStream stream;
final int userID;
MemberStatus status;
MediaStream? stream;
CallMember({
@required this.userID,
required this.userID,
this.status = MemberStatus.JOINED,
}) : assert(userID != null),
assert(status != null);
bool get hasVideoStream =>
stream != null && stream.getVideoTracks().length > 0;
stream != null && stream!.getVideoTracks().length > 0;
}

View File

@ -2,7 +2,6 @@ import 'package:comunic/enums/likes_type.dart';
import 'package:comunic/models/displayed_content.dart';
import 'package:comunic/models/like_element.dart';
import 'package:comunic/utils/account_utils.dart' as account;
import 'package:meta/meta.dart';
/// Comments
///
@ -11,24 +10,24 @@ import 'package:meta/meta.dart';
/// @author Pierre HUBERT
class Comment implements LikeElement {
final int/*!*/ id;
final int/*!*/ userID;
final int/*!*/ postID;
final int/*!*/ timeSent;
DisplayedString/*!*/ content;
final String imageURL;
int/*!*/ likes;
bool/*!*/ userLike;
final int id;
final int userID;
final int postID;
final int timeSent;
DisplayedString content;
final String? imageURL;
int likes;
bool userLike;
Comment({
@required this.id,
@required this.userID,
@required this.postID,
@required this.timeSent,
@required this.content,
@required this.imageURL,
@required this.likes,
@required this.userLike,
required this.id,
required this.userID,
required this.postID,
required this.timeSent,
required this.content,
required this.imageURL,
required this.likes,
required this.userLike,
}) : assert(id != null),
assert(userID != null),
assert(postID != null),

View File

@ -16,27 +16,27 @@ class Config {
// Theme customization
final Color splashBackgroundColor;
final Color primaryColor;
final Color primaryColorDark;
final Color? primaryColor;
final Color? primaryColorDark;
final String appName;
final String appQuickDescription;
final Color unreadConversationColor;
final Color defaultConversationColor;
final String? appQuickDescription;
final Color? unreadConversationColor;
final Color? defaultConversationColor;
// Entries for the welcome tour
final TourEntriesBuilder toursEntriesBuilder;
final TourEntriesBuilder? toursEntriesBuilder;
// Custom initialization
final Future<void> Function() additionalLoading;
final Future<void> Function()? additionalLoading;
// Custom main application route
final Widget Function(BuildContext, GlobalKey) mainRouteBuilder;
final Widget Function(BuildContext, GlobalKey)? mainRouteBuilder;
const Config({
@required this.apiServerName,
@required this.apiServerUri,
@required this.apiServerSecure,
@required this.clientName,
required this.apiServerName,
required this.apiServerUri,
required this.apiServerSecure,
required this.clientName,
this.splashBackgroundColor = defaultColor,
this.primaryColor,
this.primaryColorDark,
@ -55,9 +55,9 @@ class Config {
assert(appName != null);
/// Get and set static configuration
static Config/*?*/ _config;
static Config? _config;
static Config get() {
static Config? get() {
return _config;
}
@ -67,6 +67,6 @@ class Config {
}
/// Get the current configuration of the application
Config/*!*/ config() {
return Config.get();
Config config() {
return Config.get()!;
}

View File

@ -1,3 +1,4 @@
import 'package:collection/collection.dart' show IterableExtension;
import 'package:comunic/helpers/serialization/base_serialization_helper.dart';
import 'package:comunic/models/conversation_member.dart';
import 'package:comunic/utils/account_utils.dart';
@ -12,28 +13,28 @@ import 'group.dart';
enum CallCapabilities { NONE, AUDIO, VIDEO }
class Conversation extends SerializableElement<Conversation> {
final int id;
final int lastActivity;
final String name;
final Color color;
final String logoURL;
final int groupID;
final GroupMembershipLevel groupMinMembershipLevel;
final List<ConversationMember> members;
final bool canEveryoneAddMembers;
final int? id;
final int? lastActivity;
final String? name;
final Color? color;
final String? logoURL;
final int? groupID;
final GroupMembershipLevel? groupMinMembershipLevel;
final List<ConversationMember>? members;
final bool? canEveryoneAddMembers;
final CallCapabilities callCapabilities;
final bool isHavingCall;
Conversation({
/*required*/ @required this.id,
/*required*/ @required this.lastActivity,
@required this.name,
@required this.color,
@required this.logoURL,
@required this.groupID,
@required this.groupMinMembershipLevel,
/*required*/ @required this.members,
/*required*/ @required this.canEveryoneAddMembers,
/*required*/ required int this.id,
/*required*/ required int this.lastActivity,
required this.name,
required this.color,
required this.logoURL,
required this.groupID,
required this.groupMinMembershipLevel,
/*required*/ required List<ConversationMember> this.members,
/*required*/ required bool this.canEveryoneAddMembers,
this.callCapabilities = CallCapabilities.NONE,
this.isHavingCall = false,
}) : assert(id != null),
@ -49,7 +50,7 @@ class Conversation extends SerializableElement<Conversation> {
/// Get current user membership
ConversationMember get membership =>
members.firstWhere((m) => m.userID == userID());
members!.firstWhere((m) => m.userID == userID());
/// Check out whether current user of the application is an admin
bool get isAdmin => membership.isAdmin;
@ -61,17 +62,17 @@ class Conversation extends SerializableElement<Conversation> {
bool get following => membership.following;
/// Get the list of members in the conversation
Set<int> get membersID => members.map((e) => e.userID).toSet();
Set<int?> get membersID => members!.map((e) => e.userID).toSet();
/// Get the list of admins in the conversation
Set<int> get adminsID =>
members.where((e) => e.isAdmin).map((e) => e.userID).toSet();
Set<int?> get adminsID =>
members!.where((e) => e.isAdmin).map((e) => e.userID).toSet();
/// Get the list of the OTHER members of the conversation (all except current user)
Set<int> get otherMembersID => membersID..remove(userID());
Set<int?> get otherMembersID => membersID..remove(userID());
/// Check if the last message has been seen or not
bool get sawLastMessage => lastActivity <= membership.lastAccessTime;
bool get sawLastMessage => lastActivity! <= membership.lastAccessTime;
/// Check out whether a conversation is managed or not
bool get isManaged => isGroupConversation;
@ -86,9 +87,8 @@ class Conversation extends SerializableElement<Conversation> {
color = map["color"] == null ? null : Color(map["color"]),
logoURL = map["logoURL"],
groupID = map["groupID"],
groupMinMembershipLevel = GroupMembershipLevel.values.firstWhere(
(element) => element.toString() == map["groupMinMembershipLevel"],
orElse: () => null),
groupMinMembershipLevel = GroupMembershipLevel.values.firstWhereOrNull(
(element) => element.toString() == map["groupMinMembershipLevel"]),
lastActivity = map["lastActivity"],
members = map["members"]
.map((el) => ConversationMember.fromJSON(el))
@ -109,13 +109,13 @@ class Conversation extends SerializableElement<Conversation> {
"groupID": groupID,
"groupMinMembershipLevel": groupMinMembershipLevel?.toString(),
"lastActivity": lastActivity,
"members": members.map((e) => e.toJson()).toList(),
"members": members!.map((e) => e.toJson()).toList(),
"canEveryoneAddMembers": canEveryoneAddMembers,
};
}
@override
int compareTo(Conversation other) {
return other.lastActivity.compareTo(this.lastActivity);
return other.lastActivity!.compareTo(this.lastActivity!);
}
}

View File

@ -1,22 +1,22 @@
import 'package:flutter/widgets.dart';
/// Conversation member
///
/// @author Pierre Hubert
class ConversationMember {
final int/*!*/ userID;
final int/*!*/ lastMessageSeen;
final int/*!*/ lastAccessTime;
final bool/*!*/ following;
final bool/*!*/ isAdmin;
final int userID;
final int lastMessageSeen;
final int lastAccessTime;
final bool following;
final bool isAdmin;
const ConversationMember({
/*required*/ @required this.userID,
/*required*/ @required this.lastMessageSeen,
/*required*/ @required this.lastAccessTime,
/*required*/ @required this.following,
/*required*/ @required this.isAdmin,
/*required*/ required this.userID,
/*required*/ required this.lastMessageSeen,
/*required*/ required this.lastAccessTime,
/*required*/ required this.following,
/*required*/ required this.isAdmin,
}) : assert(userID != null),
assert(lastMessageSeen != null),
assert(lastAccessTime != null),

View File

@ -30,27 +30,27 @@ const _ConversationFileMimeTypeMapping = {
};
class ConversationMessageFile {
final String url;
final int size;
final String name;
final String thumbnail;
final String type;
final String? url;
final int? size;
final String? name;
final String? thumbnail;
final String? type;
const ConversationMessageFile({
@required this.url,
@required this.size,
@required this.name,
@required this.thumbnail,
@required this.type,
required String this.url,
required int this.size,
required String this.name,
required this.thumbnail,
required String this.type,
}) : assert(url != null),
assert(size != null),
assert(name != null),
assert(type != null);
/// Get the type of file
ConversationMessageFileType get fileType {
ConversationMessageFileType? get fileType {
if (type != null && _ConversationFileMimeTypeMapping.containsKey(type))
return _ConversationFileMimeTypeMapping[type];
return _ConversationFileMimeTypeMapping[type!];
else
return ConversationMessageFileType.OTHER;
}
@ -102,19 +102,19 @@ enum ConversationServerMessageType {
class ConversationServerMessage {
final ConversationServerMessageType type;
final int userID;
final int userWhoAdded;
final int userAdded;
final int userWhoRemoved;
final int userRemoved;
final int? userID;
final int? userWhoAdded;
final int? userAdded;
final int? userWhoRemoved;
final int? userRemoved;
const ConversationServerMessage({
@required this.type,
@required this.userID,
@required this.userWhoAdded,
@required this.userAdded,
@required this.userWhoRemoved,
@required this.userRemoved,
required this.type,
required this.userID,
required this.userWhoAdded,
required this.userAdded,
required this.userWhoRemoved,
required this.userRemoved,
}) : assert(type != null),
assert(userID != null ||
(type != ConversationServerMessageType.USER_CREATED_CONVERSATION &&
@ -124,7 +124,7 @@ class ConversationServerMessage {
assert((userWhoRemoved != null && userRemoved != null) ||
type != ConversationServerMessageType.USER_REMOVED_ANOTHER_USER);
Set<int> get usersID {
Set<int?> get usersID {
switch (type) {
case ConversationServerMessageType.USER_CREATED_CONVERSATION:
case ConversationServerMessageType.USER_LEFT_CONV:
@ -144,26 +144,26 @@ class ConversationServerMessage {
throw Exception("Unsupported server message type!");
}
String getText(UsersList list) {
String? getText(UsersList? list) {
switch (type) {
case ConversationServerMessageType.USER_CREATED_CONVERSATION:
return tr("%1% created the conversation",
args: {"1": list.getUser(userID).fullName});
args: {"1": list!.getUser(userID).fullName});
case ConversationServerMessageType.USER_ADDED_ANOTHER_USER:
return tr("%1% added %2% to the conversation", args: {
"1": list.getUser(userWhoAdded).fullName,
"1": list!.getUser(userWhoAdded).fullName,
"2": list.getUser(userAdded).fullName,
});
case ConversationServerMessageType.USER_LEFT_CONV:
return tr("%1% left the conversation", args: {
"1": list.getUser(userID).fullName,
"1": list!.getUser(userID).fullName,
});
case ConversationServerMessageType.USER_REMOVED_ANOTHER_USER:
return tr("%1% removed %2% from the conversation", args: {
"1": list.getUser(userWhoRemoved).fullName,
"1": list!.getUser(userWhoRemoved).fullName,
"2": list.getUser(userRemoved).fullName,
});
}
@ -191,29 +191,29 @@ class ConversationServerMessage {
}
class ConversationMessage extends SerializableElement<ConversationMessage> {
final int id;
final int convID;
final int userID;
final int timeSent;
final int? id;
final int? convID;
final int? userID;
final int? timeSent;
final DisplayedString message;
final ConversationMessageFile file;
final ConversationServerMessage serverMessage;
final ConversationMessageFile? file;
final ConversationServerMessage? serverMessage;
ConversationMessage({
@required this.id,
@required this.convID,
@required this.userID,
@required this.timeSent,
@required this.message,
@required this.file,
@required this.serverMessage,
required int this.id,
required int this.convID,
required this.userID,
required int this.timeSent,
required this.message,
required this.file,
required this.serverMessage,
}) : assert(id != null),
assert(convID != null),
assert(userID != null || serverMessage != null),
assert(timeSent != null),
assert(message != null || file != null || serverMessage != null);
DateTime get date => DateTime.fromMillisecondsSinceEpoch(timeSent * 1000);
DateTime get date => DateTime.fromMillisecondsSinceEpoch(timeSent! * 1000);
bool get hasMessage => !message.isNull && message.length > 0;
@ -224,16 +224,16 @@ class ConversationMessage extends SerializableElement<ConversationMessage> {
bool get isServerMessage => serverMessage != null;
/// Get the list of the ID of the users implied in this message
Set<int> get usersID {
Set<int?> get usersID {
if (userID != null) return Set()..add(userID);
if (serverMessage != null) return serverMessage.usersID;
if (serverMessage != null) return serverMessage!.usersID;
return Set();
}
@override
int compareTo(ConversationMessage other) {
return id.compareTo(other.id);
return id!.compareTo(other.id!);
}
Map<String, dynamic> toJson() {

View File

@ -3,12 +3,12 @@
/// @author Pierre Hubert
class CountUnreadNotifications {
int notifications;
int conversations;
int? notifications;
int? conversations;
CountUnreadNotifications({
this.notifications,
this.conversations,
required int this.notifications,
required int this.conversations,
}) : assert(notifications != null),
assert(conversations != null);
}

View File

@ -1,20 +1,20 @@
import 'package:flutter/material.dart';
/// Single custom emoji information
///
/// @author Pierre Hubert
class CustomEmoji {
final int id;
final int userID;
final String shortcut;
final String url;
final int? id;
final int? userID;
final String? shortcut;
final String? url;
const CustomEmoji({
@required this.id,
@required this.userID,
@required this.shortcut,
@required this.url,
required int this.id,
required int this.userID,
required String this.shortcut,
required String this.url,
}) : assert(id != null),
assert(userID != null),
assert(shortcut != null),

View File

@ -3,12 +3,12 @@
/// @author Pierre Hubert
class DataConservationPolicySettings {
int inactiveAccountLifeTime;
int notificationLifetime;
int commentsLifetime;
int postsLifetime;
int conversationMessagesLifetime;
int likesLifetime;
int? inactiveAccountLifeTime;
int? notificationLifetime;
int? commentsLifetime;
int? postsLifetime;
int? conversationMessagesLifetime;
int? likesLifetime;
DataConservationPolicySettings({
this.inactiveAccountLifeTime,

View File

@ -5,32 +5,32 @@ import 'package:comunic/utils/ui_utils.dart';
/// @author Pierre Hubert
class DisplayedString {
String _string;
String _parseCache;
String? _string;
String? _parseCache;
DisplayedString(this._string);
int get length => _string.length;
int get length => _string!.length;
bool get isEmpty => _string.isEmpty;
bool get isEmpty => _string!.isEmpty;
bool get isNull => _string == null;
String get content => _string;
String? get content => _string;
set content(String content) {
set content(String? content) {
_string = content;
_parseCache = null;
}
@override
String toString() {
return _string;
return _string!;
}
String get parsedString {
String? get parsedString {
if (_parseCache == null) {
_parseCache = parseEmojies(this._string);
_parseCache = parseEmojies(this._string!);
}
return _parseCache;

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
/// Single presence information
///
@ -11,10 +11,10 @@ class Presence {
final int day;
const Presence({
@required this.userID,
@required this.year,
@required this.month,
@required this.day,
required this.userID,
required this.year,
required this.month,
required this.day,
}) : assert(userID != null),
assert(year != null),
assert(month != null),

View File

@ -1,7 +1,6 @@
import 'package:comunic/helpers/database/database_contract.dart';
import 'package:comunic/models/cache_model.dart';
import 'package:comunic/utils/date_utils.dart';
import 'package:meta/meta.dart';
/// Single user Friend information
///
@ -9,16 +8,16 @@ import 'package:meta/meta.dart';
class Friend extends CacheModel implements Comparable<Friend> {
bool accepted;
final int lastActive;
final int? lastActive;
final bool following;
final bool canPostTexts;
Friend({
@required int id,
@required this.accepted,
@required this.lastActive,
@required this.following,
@required this.canPostTexts,
required int id,
required this.accepted,
required int this.lastActive,
required this.following,
required this.canPostTexts,
}) : assert(id != null),
assert(accepted != null),
assert(lastActive != null),
@ -27,10 +26,10 @@ class Friend extends CacheModel implements Comparable<Friend> {
super(id: id);
/// Check out whether friend is connected or not
bool get isConnected => time() - 30 < lastActive;
bool get isConnected => time() - 30 < lastActive!;
@override
int compareTo(Friend other) => other.lastActive.compareTo(lastActive);
int compareTo(Friend other) => other.lastActive!.compareTo(lastActive!);
@override
Map<String, dynamic> toMap() => {

View File

@ -1,4 +1,4 @@
import 'package:meta/meta.dart';
/// Simple friendship status
///
@ -12,11 +12,11 @@ class FriendStatus {
final bool following;
const FriendStatus({
@required this.userID,
@required this.areFriend,
@required this.sentRequest,
@required this.receivedRequest,
@required this.following,
required this.userID,
required this.areFriend,
required this.sentRequest,
required this.receivedRequest,
required this.following,
}) : assert(userID != null),
assert(areFriend != null),
assert(sentRequest != null),

View File

@ -1,5 +1,4 @@
import 'package:comunic/enums/user_page_visibility.dart';
import 'package:flutter/material.dart';
/// General settings
///
@ -18,22 +17,22 @@ class GeneralSettings {
String virtualDirectory;
String personalWebsite;
String publicNote;
String location;
String? location;
GeneralSettings({
@required this.email,
@required this.firstName,
@required this.lastName,
@required this.pageVisibility,
@required this.allowComments,
@required this.allowPostsFromFriends,
@required this.allowComunicEmails,
@required this.publicFriendsList,
@required this.publicEmail,
@required this.virtualDirectory,
@required this.personalWebsite,
@required this.publicNote,
@required this.location,
required this.email,
required this.firstName,
required this.lastName,
required this.pageVisibility,
required this.allowComments,
required this.allowPostsFromFriends,
required this.allowComunicEmails,
required this.publicFriendsList,
required this.publicEmail,
required this.virtualDirectory,
required this.personalWebsite,
required this.publicNote,
required this.location,
}) : assert(email != null),
assert(firstName != null),
assert(lastName != null),

View File

@ -1,5 +1,4 @@
import 'package:comunic/utils/intl_utils.dart';
import 'package:meta/meta.dart';
/// Group information
///
@ -14,20 +13,20 @@ enum GroupMembershipLevel {
VISITOR
}
String/*!*/ membershipToText(GroupMembershipLevel level) {
String membershipToText(GroupMembershipLevel level) {
switch (level) {
case GroupMembershipLevel.ADMINISTRATOR:
return tr("Administrator");
return tr("Administrator")!;
case GroupMembershipLevel.MODERATOR:
return tr("Moderator");
return tr("Moderator")!;
case GroupMembershipLevel.MEMBER:
return tr("Member");
return tr("Member")!;
case GroupMembershipLevel.INVITED:
return tr("Invited");
return tr("Invited")!;
case GroupMembershipLevel.PENDING:
return tr("Requested");
return tr("Requested")!;
case GroupMembershipLevel.VISITOR:
return tr("Visitor");
return tr("Visitor")!;
}
throw new Exception("Unreachable statement!");
}
@ -51,16 +50,16 @@ class Group implements Comparable<Group> {
bool following;
Group({
@required this.id,
@required this.name,
@required this.iconURL,
@required this.numberMembers,
@required this.membershipLevel,
@required this.visibilityLevel,
@required this.registrationLevel,
@required this.postCreationLevel,
@required this.virtualDirectory,
@required this.following,
required this.id,
required this.name,
required this.iconURL,
required this.numberMembers,
required this.membershipLevel,
required this.visibilityLevel,
required this.registrationLevel,
required this.postCreationLevel,
required this.virtualDirectory,
required this.following,
}) : assert(id != null),
assert(name != null),
assert(iconURL != null),

View File

@ -1,5 +1,4 @@
import 'package:comunic/models/group.dart';
import 'package:flutter/material.dart';
/// Group membership information
///
@ -12,10 +11,10 @@ class GroupMembership {
final GroupMembershipLevel level;
const GroupMembership({
@required this.userID,
@required this.groupID,
@required this.timeCreate,
@required this.level,
required this.userID,
required this.groupID,
required this.timeCreate,
required this.level,
}) : assert(userID != null),
assert(groupID != null),
assert(timeCreate != null),

View File

@ -9,6 +9,6 @@ abstract class LikeElement {
int get id;
bool userLike;
int likes;
late bool userLike;
late int likes;
}

View File

@ -1,6 +1,5 @@
import 'package:comunic/models/conversation.dart';
import 'package:comunic/models/friend.dart';
import 'package:flutter/material.dart';
/// Membership information
///
@ -10,40 +9,40 @@ enum MembershipType { FRIEND, GROUP, CONVERSATION }
class Membership {
final MembershipType type;
final Conversation conversation;
final Friend friend;
final int groupID;
final int groupLastActive;
final Conversation? conversation;
final Friend? friend;
final int? groupID;
final int? groupLastActive;
Membership.conversation(this.conversation)
Membership.conversation(Conversation this.conversation)
: type = MembershipType.CONVERSATION,
friend = null,
groupID = null,
groupLastActive = null,
assert(conversation != null);
Membership.friend(this.friend)
Membership.friend(Friend this.friend)
: type = MembershipType.FRIEND,
conversation = null,
groupID = null,
groupLastActive = null,
assert(friend != null);
Membership.group({@required this.groupID, @required this.groupLastActive})
Membership.group({required int this.groupID, required int this.groupLastActive})
: type = MembershipType.GROUP,
conversation = null,
friend = null,
assert(groupID != null),
assert(groupLastActive != null);
int get lastActive {
int? get lastActive {
switch (type) {
case MembershipType.FRIEND:
return friend.lastActive;
return friend!.lastActive;
case MembershipType.GROUP:
return groupLastActive;
case MembershipType.CONVERSATION:
return conversation.lastActivity;
return conversation!.lastActivity;
default:
throw Exception("Unreachable statment!");
}

View File

@ -1,4 +1,4 @@
import 'package:flutter/widgets.dart';
/// New account information container
///
@ -11,10 +11,10 @@ class NewAccount {
final String password;
NewAccount({
@required this.firstName,
@required this.lastName,
@required this.email,
@required this.password,
required this.firstName,
required this.lastName,
required this.email,
required this.password,
}) : assert(firstName != null),
assert(lastName != null),
assert(email != null),

View File

@ -1,5 +1,3 @@
import 'package:meta/meta.dart';
import 'api_request.dart';
/// New comment information
@ -9,12 +7,12 @@ import 'api_request.dart';
class NewComment {
final int postID;
final String content;
final BytesFile image;
final BytesFile? image;
const NewComment({
@required this.postID,
@required this.content,
@required this.image,
required this.postID,
required this.content,
required this.image,
}) : assert(postID != null);
bool get hasContent => content != null && content.length > 0;

View File

@ -6,17 +6,17 @@ import 'package:flutter/cupertino.dart';
class NewConversation {
final String name;
final List<int> members;
final List<int?> members;
final bool follow;
final bool canEveryoneAddMembers;
final Color color;
final Color? color;
const NewConversation({
@required this.name,
@required this.members,
@required this.follow,
@required this.canEveryoneAddMembers,
@required this.color,
required this.name,
required this.members,
required this.follow,
required this.canEveryoneAddMembers,
required this.color,
}) : assert(members != null),
assert(members.length > 0),
assert(follow != null),

View File

@ -1,5 +1,4 @@
import 'package:comunic/models/api_request.dart';
import 'package:meta/meta.dart';
/// New conversation message model
///
@ -9,13 +8,13 @@ import 'package:meta/meta.dart';
class NewConversationMessage {
final int conversationID;
final String message;
final BytesFile file;
final BytesFile thumbnail;
final String? message;
final BytesFile? file;
final BytesFile? thumbnail;
NewConversationMessage({
@required this.conversationID,
@required this.message,
required this.conversationID,
required this.message,
this.file,
this.thumbnail,
}) : assert(conversationID != null),

View File

@ -9,16 +9,16 @@ class NewConversationsSettings {
final bool following;
final bool isComplete;
final String name;
final bool canEveryoneAddMembers;
final Color color;
final bool? canEveryoneAddMembers;
final Color? color;
const NewConversationsSettings({
@required this.convID,
@required this.following,
@required this.isComplete,
@required this.name,
@required this.canEveryoneAddMembers,
@required this.color,
required this.convID,
required this.following,
required this.isComplete,
required this.name,
required this.canEveryoneAddMembers,
required this.color,
}) : assert(convID != null),
assert(convID > 0),
assert(following != null),

View File

@ -1,5 +1,3 @@
import 'package:flutter/material.dart';
import 'api_request.dart';
/// New emoji information
@ -11,8 +9,8 @@ class NewEmoji {
final BytesFile image;
const NewEmoji({
@required this.shortcut,
@required this.image,
required this.shortcut,
required this.image,
}) : assert(shortcut != null),
assert(image != null);
}

View File

@ -1,5 +1,4 @@
import 'package:comunic/models/group.dart';
import 'package:flutter/foundation.dart';
/// This class contains information about a conversation linked to a group
/// to create
@ -12,9 +11,9 @@ class NewGroupConversation {
final GroupMembershipLevel minMembershipLevel;
const NewGroupConversation({
@required this.groupID,
@required this.name,
@required this.minMembershipLevel,
required this.groupID,
required this.name,
required this.minMembershipLevel,
}) : assert(groupID != null),
assert(name != null),
assert(minMembershipLevel != null);

View File

@ -1,7 +1,6 @@
import 'package:comunic/enums/post_kind.dart';
import 'package:comunic/enums/post_target.dart';
import 'package:comunic/enums/post_visibility_level.dart';
import 'package:meta/meta.dart';
import 'api_request.dart';
@ -15,9 +14,9 @@ class NewSurvey {
final bool allowNewChoicesCreation;
const NewSurvey({
@required this.question,
@required this.answers,
@required this.allowNewChoicesCreation,
required this.question,
required this.answers,
required this.allowNewChoicesCreation,
}) : assert(question != null),
assert(answers.length > 1),
assert(allowNewChoicesCreation != null);
@ -28,26 +27,26 @@ class NewPost {
final int targetID;
final PostVisibilityLevel visibility;
final String content;
final BytesFile image;
final String url;
final List<int> pdf;
final BytesFile? image;
final String? url;
final List<int>? pdf;
final PostKind kind;
final DateTime timeEnd;
final NewSurvey survey;
final String youtubeId;
final DateTime? timeEnd;
final NewSurvey? survey;
final String? youtubeId;
const NewPost({
@required this.target,
@required this.targetID,
@required this.visibility,
@required this.content,
@required this.kind,
@required this.image,
@required this.url,
@required this.pdf,
@required this.timeEnd,
@required this.survey,
@required this.youtubeId,
required this.target,
required this.targetID,
required this.visibility,
required this.content,
required this.kind,
required this.image,
required this.url,
required this.pdf,
required this.timeEnd,
required this.survey,
required this.youtubeId,
}) : assert(target != null),
assert(targetID != null),
assert(visibility != null),

View File

@ -1,4 +1,4 @@
import 'package:flutter/widgets.dart';
/// Notification model
///
@ -45,19 +45,19 @@ class Notification {
final int onElemId;
final NotificationElementType onElemType;
final NotificationType type;
final int fromContainerId;
final NotificationElementType fromContainerType;
final int? fromContainerId;
final NotificationElementType? fromContainerType;
const Notification({
@required this.id,
@required this.timeCreate,
@required this.seen,
@required this.fromUser,
@required this.onElemId,
@required this.onElemType,
@required this.type,
@required this.fromContainerId,
@required this.fromContainerType,
required this.id,
required this.timeCreate,
required this.seen,
required this.fromUser,
required this.onElemId,
required this.onElemType,
required this.type,
required this.fromContainerId,
required this.fromContainerType,
}) : assert(id != null),
assert(timeCreate != null),
assert(seen != null),

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
/// Notifications settings
///
@ -9,8 +9,8 @@ class NotificationsSettings {
bool allowNotificationsSound;
NotificationsSettings({
@required this.allowConversations,
@required this.allowNotificationsSound,
required this.allowConversations,
required this.allowNotificationsSound,
}) : assert(allowConversations != null),
assert(allowNotificationsSound != null);
}

View File

@ -6,7 +6,6 @@ import 'package:comunic/lists/comments_list.dart';
import 'package:comunic/models/displayed_content.dart';
import 'package:comunic/models/like_element.dart';
import 'package:comunic/models/survey.dart';
import 'package:meta/meta.dart';
/// Single post information
///
@ -15,50 +14,50 @@ import 'package:meta/meta.dart';
class Post implements LikeElement {
final int id;
final int userID;
final int userPageID;
final int groupID;
final int? userPageID;
final int? groupID;
final int timeSent;
DisplayedString content;
PostVisibilityLevel visibilityLevel;
final PostKind kind;
final int fileSize;
final String fileType;
final String filePath;
final String fileURL;
final int timeEnd;
final String linkURL;
final String linkTitle;
final String linkDescription;
final String linkImage;
final int? fileSize;
final String? fileType;
final String? filePath;
final String? fileURL;
final int? timeEnd;
final String? linkURL;
final String? linkTitle;
final String? linkDescription;
final String? linkImage;
int likes;
bool userLike;
final UserAccessLevels access;
final CommentsList comments;
Survey survey;
final CommentsList? comments;
Survey? survey;
Post(
{@required this.id,
@required this.userID,
@required this.userPageID,
@required this.groupID,
@required this.timeSent,
@required this.content,
@required this.visibilityLevel,
@required this.kind,
@required this.fileSize,
@required this.fileType,
@required this.filePath,
@required this.fileURL,
@required this.timeEnd,
@required this.linkURL,
@required this.linkTitle,
@required this.linkDescription,
@required this.linkImage,
@required this.likes,
@required this.userLike,
@required this.access,
@required this.comments,
@required this.survey})
{required this.id,
required this.userID,
required this.userPageID,
required this.groupID,
required this.timeSent,
required this.content,
required this.visibilityLevel,
required this.kind,
required this.fileSize,
required this.fileType,
required this.filePath,
required this.fileURL,
required this.timeEnd,
required this.linkURL,
required this.linkTitle,
required this.linkDescription,
required this.linkImage,
required this.likes,
required this.userLike,
required this.access,
required this.comments,
required this.survey})
: assert(id != null),
assert(userID != null),
assert(userPageID != 0 || groupID != 0),
@ -72,7 +71,7 @@ class Post implements LikeElement {
assert(userLike != null),
assert(access != null);
bool get isGroupPost => groupID != null && groupID > 0;
bool get isGroupPost => groupID != null && groupID! > 0;
bool get hasContent => content != null && !content.isNull;

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
/// Check password reset token result
///
@ -10,9 +10,9 @@ class ResCheckPasswordToken {
final String email;
const ResCheckPasswordToken({
@required this.firstName,
@required this.lastName,
@required this.email,
required this.firstName,
required this.lastName,
required this.email,
}) : assert(firstName != null),
assert(lastName != null),
assert(email != null);

View File

@ -1,4 +1,4 @@
import 'package:flutter/cupertino.dart';
/// Single search result
///
@ -11,8 +11,8 @@ class SearchResult {
final SearchResultKind kind;
SearchResult({
@required this.id,
@required this.kind,
required this.id,
required this.kind,
}) : assert(id != null),
assert(kind != null);
}

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
/// Security settings of the user
///
@ -11,10 +11,10 @@ class SecuritySettings {
final String securityAnswer2;
const SecuritySettings({
@required this.securityQuestion1,
@required this.securityAnswer1,
@required this.securityQuestion2,
@required this.securityAnswer2,
required this.securityQuestion1,
required this.securityAnswer1,
required this.securityQuestion2,
required this.securityAnswer2,
}) : assert(securityQuestion1 != null),
assert(securityAnswer1 != null),
assert(securityQuestion2 != null),

View File

@ -1,5 +1,4 @@
import 'package:comunic/utils/date_utils.dart';
import 'package:flutter/widgets.dart';
import 'package:version/version.dart';
/// Server static configuration
@ -11,8 +10,8 @@ class NotificationsPolicy {
final bool hasIndependent;
const NotificationsPolicy({
@required this.hasFirebase,
@required this.hasIndependent,
required this.hasFirebase,
required this.hasIndependent,
}) : assert(hasFirebase != null),
assert(hasIndependent != null);
}
@ -28,14 +27,14 @@ class PasswordPolicy {
final int minCategoriesPresence;
const PasswordPolicy({
@required this.allowMailInPassword,
@required this.allowNameInPassword,
@required this.minPasswordLength,
@required this.minNumberUpperCaseLetters,
@required this.minNumberLowerCaseLetters,
@required this.minNumberDigits,
@required this.minNumberSpecialCharacters,
@required this.minCategoriesPresence,
required this.allowMailInPassword,
required this.allowNameInPassword,
required this.minPasswordLength,
required this.minNumberUpperCaseLetters,
required this.minNumberLowerCaseLetters,
required this.minNumberDigits,
required this.minNumberSpecialCharacters,
required this.minCategoriesPresence,
}) : assert(allowMailInPassword != null),
assert(allowNameInPassword != null),
assert(minPasswordLength != null),
@ -55,12 +54,12 @@ class ServerDataConservationPolicy {
final int minLikesLifetime;
const ServerDataConservationPolicy({
@required this.minInactiveAccountLifetime,
@required this.minNotificationLifetime,
@required this.minCommentsLifetime,
@required this.minPostsLifetime,
@required this.minConversationMessagesLifetime,
@required this.minLikesLifetime,
required this.minInactiveAccountLifetime,
required this.minNotificationLifetime,
required this.minCommentsLifetime,
required this.minPostsLifetime,
required this.minConversationMessagesLifetime,
required this.minLikesLifetime,
}) : assert(minInactiveAccountLifetime != null),
assert(minNotificationLifetime != null),
assert(minCommentsLifetime != null),
@ -85,19 +84,19 @@ class ConversationsPolicy {
final int maxLogoHeight;
const ConversationsPolicy({
@required this.maxConversationNameLen,
@required this.minMessageLen,
@required this.maxMessageLen,
@required this.allowedFilesType,
@required this.filesMaxSize,
@required this.writingEventInterval,
@required this.writingEventLifetime,
@required this.maxMessageImageWidth,
@required this.maxMessageImageHeight,
@required this.maxThumbnailWidth,
@required this.maxThumbnailHeight,
@required this.maxLogoWidth,
@required this.maxLogoHeight,
required this.maxConversationNameLen,
required this.minMessageLen,
required this.maxMessageLen,
required this.allowedFilesType,
required this.filesMaxSize,
required this.writingEventInterval,
required this.writingEventLifetime,
required this.maxMessageImageWidth,
required this.maxMessageImageHeight,
required this.maxThumbnailWidth,
required this.maxThumbnailHeight,
required this.maxLogoWidth,
required this.maxLogoHeight,
}) : assert(maxConversationNameLen != null),
assert(minMessageLen != null),
assert(maxMessageLen != null),
@ -121,11 +120,11 @@ class AccountInformationPolicy {
final int maxLocationLength;
const AccountInformationPolicy({
@required this.minFirstNameLength,
@required this.maxFirstNameLength,
@required this.minLastNameLength,
@required this.maxLastNameLength,
@required this.maxLocationLength,
required this.minFirstNameLength,
required this.maxFirstNameLength,
required this.minLastNameLength,
required this.maxLastNameLength,
required this.maxLocationLength,
}) : assert(minFirstNameLength != null),
assert(maxFirstNameLength != null),
assert(minLastNameLength != null),
@ -136,7 +135,7 @@ class AccountInformationPolicy {
enum BannerNature { Information, Warning, Success }
extension BannerNatureExt on BannerNature {
static BannerNature fromStr(String s) {
static BannerNature fromStr(String? s) {
switch (s) {
case "information":
return BannerNature.Information;
@ -151,22 +150,22 @@ extension BannerNatureExt on BannerNature {
class Banner {
final bool enabled;
final int expire;
final int? expire;
final BannerNature nature;
final Map<String, String> message;
final String link;
final String? link;
const Banner({
@required this.enabled,
@required this.expire,
@required this.nature,
@required this.message,
@required this.link,
required this.enabled,
required this.expire,
required this.nature,
required this.message,
required this.link,
}) : assert(enabled != null),
assert(nature != null),
assert(message != null);
bool get visible => enabled && (expire == null || expire > time());
bool get visible => enabled && (expire == null || expire! > time());
}
class ServerConfig {
@ -176,7 +175,7 @@ class ServerConfig {
final String contactEmail;
final String playStoreURL;
final String androidDirectDownloadURL;
final Banner banner;
final Banner? banner;
final NotificationsPolicy notificationsPolicy;
final PasswordPolicy passwordPolicy;
final ServerDataConservationPolicy dataConservationPolicy;
@ -184,18 +183,18 @@ class ServerConfig {
final AccountInformationPolicy accountInformationPolicy;
const ServerConfig({
@required this.minSupportedMobileVersion,
@required this.termsURL,
@required this.privacyPolicyURL,
@required this.contactEmail,
@required this.playStoreURL,
@required this.androidDirectDownloadURL,
@required this.banner,
@required this.notificationsPolicy,
@required this.passwordPolicy,
@required this.dataConservationPolicy,
@required this.conversationsPolicy,
@required this.accountInformationPolicy,
required this.minSupportedMobileVersion,
required this.termsURL,
required this.privacyPolicyURL,
required this.contactEmail,
required this.playStoreURL,
required this.androidDirectDownloadURL,
required this.banner,
required this.notificationsPolicy,
required this.passwordPolicy,
required this.dataConservationPolicy,
required this.conversationsPolicy,
required this.accountInformationPolicy,
}) : assert(minSupportedMobileVersion != null),
assert(termsURL != null),
assert(privacyPolicyURL != null),

View File

@ -1,6 +1,5 @@
import 'package:comunic/models/survey_choice.dart';
import 'package:comunic/utils/account_utils.dart' as account;
import 'package:meta/meta.dart';
/// Survey information
///
@ -17,14 +16,14 @@ class Survey {
bool allowNewChoicesCreation;
Survey({
@required this.id,
@required this.userID,
@required this.postID,
@required this.creationTime,
@required this.question,
@required this.userChoice,
@required this.choices,
@required this.allowNewChoicesCreation,
required this.id,
required this.userID,
required this.postID,
required this.creationTime,
required this.question,
required this.userChoice,
required this.choices,
required this.allowNewChoicesCreation,
}) : assert(id != null),
assert(userID != null),
assert(postID != null),
@ -43,14 +42,14 @@ class Survey {
bool get canBlockNewChoicesCreation =>
allowNewChoicesCreation && account.userID() == this.userID;
SurveyChoice get userResponse {
SurveyChoice? get userResponse {
if (!hasResponded) return null;
return choices.firstWhere((e) => e.id == userChoice);
}
void cancelUserResponse() {
if (hasResponded) userResponse.responses--;
if (hasResponded) userResponse!.responses--;
userChoice = 0;
}

View File

@ -1,4 +1,4 @@
import 'package:meta/meta.dart';
/// Single survey choice
///
@ -10,9 +10,9 @@ class SurveyChoice {
int responses;
SurveyChoice({
@required this.id,
@required this.name,
@required this.responses,
required this.id,
required this.name,
required this.responses,
}) : assert(id != null),
assert(name != null),
assert(responses != null);

View File

@ -1,6 +1,5 @@
import 'package:comunic/models/conversation.dart';
import 'package:comunic/models/conversation_message.dart';
import 'package:flutter/material.dart';
/// Unread conversation information
///
@ -11,8 +10,8 @@ class UnreadConversation {
final ConversationMessage message;
const UnreadConversation({
@required this.conv,
@required this.message,
required this.conv,
required this.message,
}) : assert(conv != null),
assert(message != null);
}

View File

@ -5,7 +5,6 @@ import 'package:comunic/helpers/serialization/base_serialization_helper.dart';
import 'package:comunic/lists/custom_emojies_list.dart';
import 'package:comunic/utils/account_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:meta/meta.dart';
/// Single user information
///
@ -13,21 +12,21 @@ import 'package:meta/meta.dart';
class User implements SerializableElement<User> {
final int id;
final String firstName;
final String lastName;
final String? firstName;
final String? lastName;
final UserPageVisibility pageVisibility;
final String virtualDirectory;
final String accountImageURL;
final String? virtualDirectory;
final String? accountImageURL;
final CustomEmojiesList customEmojies;
const User({
@required this.id,
@required this.firstName,
@required this.lastName,
@required this.pageVisibility,
@required this.virtualDirectory,
@required this.accountImageURL,
@required this.customEmojies,
required int this.id,
required String this.firstName,
required String this.lastName,
required this.pageVisibility,
required this.virtualDirectory,
required String this.accountImageURL,
required this.customEmojies,
}) : assert(id != null),
assert(id > 0),
assert(firstName != null),
@ -37,13 +36,13 @@ class User implements SerializableElement<User> {
assert(customEmojies != null);
/// Get user full name
String get fullName => firstName + " " + lastName;
String get fullName => firstName! + " " + lastName!;
/// Get user display name
String get displayName => htmlDecodeCharacters(fullName);
bool get hasVirtualDirectory =>
virtualDirectory != null && virtualDirectory.length > 0;
virtualDirectory != null && virtualDirectory!.length > 0;
bool get isCurrentUser => id == userID();
@ -69,5 +68,5 @@ class User implements SerializableElement<User> {
jsonDecode(map["customEmojies"]));
@override
int compareTo(User other) => id.compareTo(other.id);
int compareTo(User other) => id!.compareTo(other.id!);
}

View File

@ -1,7 +1,5 @@
import 'dart:convert';
import 'package:flutter/widgets.dart';
/// WebSocket message
///
/// @author Pierre Hubert
@ -12,9 +10,9 @@ class WsMessage {
final dynamic data;
const WsMessage({
@required this.id,
@required this.title,
@required this.data,
required this.id,
required this.title,
required this.data,
}) : assert(id != null),
assert(title != null),
assert(title.length > 0);