1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2025-06-20 16:55:17 +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

@ -8,16 +8,16 @@ import 'package:comunic/models/advanced_group_info.dart';
///
/// @author Pierre Hubert
AdvancedGroupInfo _forezGroup;
AdvancedGroupInfo? _forezGroup;
class ForezGroupHelper {
static Future<void> setId(int groupID) async {
(await PreferencesHelper.getInstance())
(await PreferencesHelper.getInstance())!
.setInt(PreferencesKeyList.FOREZ_GROUP, groupID);
}
static Future<int> getId() async {
return (await PreferencesHelper.getInstance())
static Future<int?> getId() async {
return (await PreferencesHelper.getInstance())!
.getInt(PreferencesKeyList.FOREZ_GROUP);
}
@ -27,7 +27,7 @@ class ForezGroupHelper {
_forezGroup = res.info;
}
static AdvancedGroupInfo getGroup() => _forezGroup;
static AdvancedGroupInfo? getGroup() => _forezGroup;
}
AdvancedGroupInfo get forezGroup => ForezGroupHelper.getGroup();
AdvancedGroupInfo? get forezGroup => ForezGroupHelper.getGroup();

View File

@ -11,10 +11,10 @@ import 'package:flutter/material.dart';
class ForezConfig extends Config {
ForezConfig({
@required String apiServerName,
@required String apiServerUri,
@required bool apiServerSecure,
@required String clientName,
required String apiServerName,
required String apiServerUri,
required bool apiServerSecure,
required String clientName,
}) : super(
apiServerName: apiServerName,
apiServerUri: apiServerUri,

View File

@ -11,7 +11,7 @@ import 'package:comunic/models/config.dart';
/// Fix HTTPS issue
class MyHttpOverride extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext context) {
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..badCertificateCallback = (cert, host, port) {
return host == "devweb.local"; // Forcefully trust local website

View File

@ -29,7 +29,7 @@ List<Widget> buildTour(TourRouteState state) {
msgTwo: tr("Let's first join a Forez group!"),
),
JoinForezGroupPane(
key: state.pubKeys[_JOIN_GROUP_KEY_ID],
key: state.pubKeys[_JOIN_GROUP_KEY_ID] as GlobalKey<JoinGroupPaneBodyState>?,
onUpdated: () => state.rebuild(),
),
FirstTourPane(
@ -51,7 +51,7 @@ List<Widget> buildTour(TourRouteState state) {
// Forez specific features
PresentationPane(
icon: Icons.calendar_today,
title: tr("Presence in Forez"),
title: tr("Presence in Forez")!,
text: tr(
"Easily specify the days you are in Forez plain, so that everyone can know it!"),
actionTitle: tr("Do it now!"),
@ -62,7 +62,7 @@ List<Widget> buildTour(TourRouteState state) {
// Chat pane
PresentationPane(
icon: Icons.question_answer,
title: tr("Conversations"),
title: tr("Conversations")!,
text: tr(
"#Forez now integrates the conversation system of Comunic, so you have access both to public and private conversations!"),
),

View File

@ -16,17 +16,17 @@ import 'package:flutter/material.dart';
class JoinForezGroupPane extends PresentationPane {
JoinForezGroupPane({
@required Function() onUpdated,
@required GlobalKey<JoinGroupPaneBodyState> key,
required Function() onUpdated,
required GlobalKey<JoinGroupPaneBodyState>? key,
}) : super(
icon: Icons.login,
title: tr("Join a Forez group"),
title: tr("Join a Forez group")!,
child: (c) => _JoinGroupPaneBody(
key: key,
onUpdated: onUpdated,
),
canGoNext: key?.currentState?.canGoNext ?? false,
onTapNext: (c) => key.currentState.validateChoice(),
onTapNext: (c) => key!.currentState!.validateChoice(),
);
}
@ -34,8 +34,8 @@ class _JoinGroupPaneBody extends StatefulWidget {
final Function() onUpdated;
const _JoinGroupPaneBody({
Key key,
@required this.onUpdated,
Key? key,
required this.onUpdated,
}) : assert(onUpdated != null),
super(key: key);
@ -46,10 +46,10 @@ class _JoinGroupPaneBody extends StatefulWidget {
class JoinGroupPaneBodyState extends State<_JoinGroupPaneBody> {
final _key = GlobalKey<AsyncScreenWidgetState>();
List<Group> _groups;
int _currChoice;
late List<Group> _groups;
int? _currChoice;
bool get canGoNext => _currChoice != null && _currChoice > 0;
bool get canGoNext => _currChoice != null && _currChoice! > 0;
Group get _currGroup => _groups.firstWhere((e) => e.id == _currChoice);
@ -65,17 +65,17 @@ class JoinGroupPaneBodyState extends State<_JoinGroupPaneBody> {
key: _key,
onReload: _load,
onBuild: onBuild,
errorMessage: tr("Failed to load the list of Forez groups!"));
errorMessage: tr("Failed to load the list of Forez groups!")!);
Widget onBuild() => ConstrainedBox(
constraints: BoxConstraints(maxWidth: 300),
child: Column(
children: [
Text(tr("Please choose now the Forez group you want to join...")),
Text(tr("Please choose now the Forez group you want to join...")!),
]..addAll(_groups.map((e) => RadioListTile(
value: e.id,
groupValue: _currChoice,
onChanged: (v) => setState(() => _currChoice = e.id),
onChanged: (dynamic v) => setState(() => _currChoice = e.id),
title: Text(e.name),
subtitle: Text(e.membershipText),
))),
@ -112,7 +112,7 @@ class JoinGroupPaneBodyState extends State<_JoinGroupPaneBody> {
await alert(context,
"${tr("You can not access this group yet, please wait for a member of the group to accept your request.")}\n${tr("Hopefully this will not be too long.")}\n${tr("Please check back soon!")}");
_key.currentState.refresh();
_key.currentState!.refresh();
return false;
}
@ -121,8 +121,8 @@ class JoinGroupPaneBodyState extends State<_JoinGroupPaneBody> {
return true;
} catch (e, s) {
logError(e, s);
snack(context, tr("Failed to register to group!"));
_key.currentState.refresh();
snack(context, tr("Failed to register to group!")!);
_key.currentState!.refresh();
return false;
}
}

View File

@ -24,8 +24,8 @@ class ForezMemberProfileRoute extends StatefulWidget {
final int userID;
const ForezMemberProfileRoute({
Key key,
@required this.userID,
Key? key,
required this.userID,
}) : assert(userID != null),
super(key: key);
@ -39,13 +39,13 @@ class _ForezMemberProfileRouteState extends State<ForezMemberProfileRoute> {
final _key = GlobalKey<AsyncScreenWidgetState>();
AdvancedUserInfo _user;
PresenceSet _presence;
late AdvancedUserInfo _user;
late PresenceSet _presence;
Future<void> _load() async {
_user = await ForezGroupsHelper.getMemberInfo(forezGroup.id, widget.userID);
_user = await ForezGroupsHelper.getMemberInfo(forezGroup!.id, widget.userID);
_presence =
await ForezPresenceHelper.getForUser(forezGroup.id, widget.userID);
await ForezPresenceHelper.getForUser(forezGroup!.id, widget.userID);
}
@override
@ -56,25 +56,25 @@ class _ForezMemberProfileRouteState extends State<ForezMemberProfileRoute> {
loadingWidget: _buildLoading(),
errorWidget: _buildError(),
errorMessage: tr(
"Failed to load user information, maybe it is not a Forez member yet?"));
"Failed to load user information, maybe it is not a Forez member yet?")!);
Widget _buildLoading() => Scaffold(
appBar: AppBar(
title: Text(tr("Loading...")),
title: Text(tr("Loading...")!),
),
body: buildCenteredProgressBar(),
);
Widget _buildError() => Scaffold(
appBar: AppBar(
title: Text(tr("Error")),
title: Text(tr("Error")!),
),
body: buildErrorCard(
tr("Failed to load user information, maybe it is not a Forez member yet?"),
actions: [
MaterialButton(
onPressed: () => _key.currentState.refresh(),
child: Text(tr("Try again")),
onPressed: () => _key.currentState!.refresh(),
child: Text(tr("Try again")!),
textColor: Colors.white,
)
]),
@ -101,7 +101,7 @@ class _ForezMemberProfileRouteState extends State<ForezMemberProfileRoute> {
? Container()
: CachedNetworkImage(
fit: BoxFit.cover,
imageUrl: _user.accountImageURL,
imageUrl: _user.accountImageURL!,
height: _appBarHeight,
),
// This gradient ensures that the toolbar icons are distinct
@ -135,7 +135,7 @@ class _ForezMemberProfileRouteState extends State<ForezMemberProfileRoute> {
: ListTile(
leading: Icon(Icons.note),
title: TextWidget(content: DisplayedString(_user.publicNote)),
subtitle: Text(tr("Note")),
subtitle: Text(tr("Note")!),
),
// Email address
@ -143,9 +143,9 @@ class _ForezMemberProfileRouteState extends State<ForezMemberProfileRoute> {
? Container()
: ListTile(
leading: Icon(Icons.email),
title: Text(_user.emailAddress),
subtitle: Text(tr("Email address")),
trailing: CopyIcon(_user.emailAddress),
title: Text(_user.emailAddress!),
subtitle: Text(tr("Email address")!),
trailing: CopyIcon(_user.emailAddress!),
),
// Location
@ -153,9 +153,9 @@ class _ForezMemberProfileRouteState extends State<ForezMemberProfileRoute> {
? Container()
: ListTile(
leading: Icon(Icons.location_on),
title: Text(_user.location),
subtitle: Text(tr("Location")),
trailing: CopyIcon(_user.location),
title: Text(_user.location!),
subtitle: Text(tr("Location")!),
trailing: CopyIcon(_user.location!),
),
// Website
@ -164,7 +164,7 @@ class _ForezMemberProfileRouteState extends State<ForezMemberProfileRoute> {
: ListTile(
leading: Icon(Icons.link),
title: Text(_user.personalWebsite),
subtitle: Text(tr("Website")),
subtitle: Text(tr("Website")!),
trailing: IconButton(
icon: Icon(Icons.open_in_new),
onPressed: () => launch(_user.personalWebsite),
@ -174,10 +174,10 @@ class _ForezMemberProfileRouteState extends State<ForezMemberProfileRoute> {
Divider(),
ListTile(
leading: Icon(Icons.calendar_today),
title: Text(tr("Presence in Forez")),
title: Text(tr("Presence in Forez")!),
subtitle: Text(_presence.containsDate(DateTime.now())
? tr("Present today")
: tr("Absent")),
? tr("Present today")!
: tr("Absent")!),
),
PresenceCalendarWidget(presenceSet: _presence),
Divider(),

View File

@ -21,7 +21,7 @@ import 'package:flutter/material.dart';
/// @author Pierre Hubert
class ForezRoute extends StatefulWidget implements MainRoute {
const ForezRoute({Key key}) : super(key: key);
const ForezRoute({Key? key}) : super(key: key);
@override
State<StatefulWidget> createState() => _MainRouteState();
@ -40,7 +40,7 @@ class _MainRouteState extends MainController {
@override
Widget build(BuildContext context) {
if (forezGroup == null) return Text(tr("Missing Forez group!"));
if (forezGroup == null) return Text(tr("Missing Forez group!")!);
return StatusWidget(
child: (c) => SafeArea(
@ -67,11 +67,11 @@ class _MainRouteState extends MainController {
@override
void openConversation(Conversation conv, {fullScreen: false}) {
// Forcefully open conversations in a "normal" way (do not display groups)
openConversationById(conv.id, fullScreen: fullScreen);
openConversationById(conv.id!, fullScreen: fullScreen);
}
@override
void openGroup(int groupID, {int conversationID}) => _unsupportedFeature();
void openGroup(int groupID, {int? conversationID}) => _unsupportedFeature();
@override
void openUserPage(int userID) => pushPage(PageInfo(
@ -92,7 +92,7 @@ class _MainRouteState extends MainController {
enum _PopupMenuItems { ACTION_SETTINGS, ACTION_SIGN_OUT }
class ForezRouteBody extends StatefulWidget {
ForezRouteBody({Key key}) : super(key: key);
ForezRouteBody({Key? key}) : super(key: key);
@override
_ForezRouteBodyState createState() => _ForezRouteBodyState();
@ -112,7 +112,7 @@ class _ForezRouteBodyState extends SafeState<ForezRouteBody> {
length: _tabs.length,
child: Scaffold(
appBar: AppBar(
title: Text(forezGroup.name),
title: Text(forezGroup!.name),
actions: <Widget>[_buildPopupMenuButton()],
bottom: TabBar(tabs: _tabs),
),
@ -129,11 +129,11 @@ class _ForezRouteBodyState extends SafeState<ForezRouteBody> {
Widget _buildPopupMenuButton() => PopupMenuButton<_PopupMenuItems>(
itemBuilder: (c) => [
PopupMenuItem(
child: Text(tr("Settings")),
child: Text(tr("Settings")!),
value: _PopupMenuItems.ACTION_SETTINGS,
),
PopupMenuItem(
child: Text(tr("Sign out")),
child: Text(tr("Sign out")!),
value: _PopupMenuItems.ACTION_SIGN_OUT,
),
],
@ -143,10 +143,10 @@ class _ForezRouteBodyState extends SafeState<ForezRouteBody> {
void _onMenuSelection(_PopupMenuItems value) {
switch (value) {
case _PopupMenuItems.ACTION_SETTINGS:
MainController.of(context).openSettings();
MainController.of(context)!.openSettings();
break;
case _PopupMenuItems.ACTION_SIGN_OUT:
MainController.of(context).requestLogout();
MainController.of(context)!.requestLogout();
break;
}
}
@ -155,29 +155,29 @@ class _ForezRouteBodyState extends SafeState<ForezRouteBody> {
// Posts tab
_Tab(
icon: Icons.auto_stories,
title: tr("Posts"),
widget: () => GroupPostsSection(group: forezGroup),
title: tr("Posts")!,
widget: () => GroupPostsSection(group: forezGroup!),
),
// Presence tab
_Tab(
icon: Icons.calendar_today,
title: tr("Presence"),
widget: () => ForezPresenceSection(groupID: forezGroup.id),
title: tr("Presence")!,
widget: () => ForezPresenceSection(groupID: forezGroup!.id),
),
// Conversations tab
_Tab(
icon: Icons.question_answer,
title: tr("Conversations"),
title: tr("Conversations")!,
widget: () => ConversationsListScreen(),
isUnread: (c) => StatusWidgetState.of(c).unreadConversations > 0,
isUnread: (c) => StatusWidgetState.of(c)!.unreadConversations! > 0,
),
// Directory tab
_Tab(
icon: Icons.import_contacts,
title: tr("Directory"),
title: tr("Directory")!,
widget: () => ForezDirectoryScreen(),
),
];
@ -203,12 +203,12 @@ class _Tab {
final IconData icon;
final String title;
final Widget Function() widget;
final bool Function(BuildContext) isUnread;
final bool Function(BuildContext)? isUnread;
const _Tab({
@required this.icon,
@required this.title,
@required this.widget,
required this.icon,
required this.title,
required this.widget,
this.isUnread,
}) : assert(icon != null),
assert(title != null),

View File

@ -7,18 +7,18 @@ import 'package:flutter/material.dart';
///
/// @author Pierre Hubert
Future<User> searchUser(BuildContext context, UsersList users) async {
return await showSearch<User>(
Future<User?> searchUser(BuildContext context, UsersList users) async {
return await showSearch<User?>(
context: context, delegate: _SearchDelegate(users));
}
class _SearchDelegate extends SearchDelegate<User> {
class _SearchDelegate extends SearchDelegate<User?> {
final UsersList _usersList;
_SearchDelegate(this._usersList) : assert(_usersList != null);
@override
List<Widget> buildActions(BuildContext context) => null;
List<Widget>? buildActions(BuildContext context) => null;
@override
Widget buildLeading(BuildContext context) => IconButton(
@ -28,7 +28,7 @@ class _SearchDelegate extends SearchDelegate<User> {
@override
Widget buildSuggestions(BuildContext context) {
final list = _usersList
final List<User> list = _usersList
.where((element) =>
element.fullName.toLowerCase().contains(query.toLowerCase()))
.toList();

View File

@ -35,11 +35,11 @@ class ForezDirectoryScreen extends StatefulWidget {
class _ForezDirectoryScreenState extends State<ForezDirectoryScreen> {
final _key = GlobalKey<AsyncScreenWidgetState>();
UsersList _users;
GroupMembersList _members;
late UsersList _users;
late GroupMembersList _members;
Future<void> _load() async {
_members = await GroupsHelper.getMembersList(forezGroup.id);
_members = await GroupsHelper.getMembersList(forezGroup!.id);
_users = await UsersHelper().getListWithThrow(_members.usersID);
}
@ -49,7 +49,7 @@ class _ForezDirectoryScreenState extends State<ForezDirectoryScreen> {
AsyncScreenWidget(
onReload: _load,
onBuild: onBuild,
errorMessage: tr("Failed to load members list!"),
errorMessage: tr("Failed to load members list!")!,
key: _key,
),
Positioned(
@ -88,13 +88,13 @@ class _ForezDirectoryScreenState extends State<ForezDirectoryScreen> {
"Do you really want to cancel the invitation sent to %u%?",
args: {"u": user.fullName}))) return;
await GroupsHelper.cancelInvitation(forezGroup.id, user.id);
_key.currentState.refresh();
await GroupsHelper.cancelInvitation(forezGroup!.id, user.id);
_key.currentState!.refresh();
break;
case _PopupMenuActions.ACCEPT_REQUEST:
await GroupsHelper.respondRequest(forezGroup.id, user.id, true);
_key.currentState.refresh();
await GroupsHelper.respondRequest(forezGroup!.id, user.id, true);
_key.currentState!.refresh();
break;
case _PopupMenuActions.REJECT_REQUEST:
@ -104,13 +104,13 @@ class _ForezDirectoryScreenState extends State<ForezDirectoryScreen> {
"Do you really want to reject the request of %u% to join the Forez group?",
args: {"u": user.fullName}))) return;
await GroupsHelper.respondRequest(forezGroup.id, user.id, false);
_key.currentState.refresh();
await GroupsHelper.respondRequest(forezGroup!.id, user.id, false);
_key.currentState!.refresh();
break;
}
} catch (e, s) {
logError(e, s);
snack(context, tr("Error while processing action!"));
snack(context, tr("Error while processing action!")!);
}
}
@ -125,7 +125,7 @@ class _ForezDirectoryScreenState extends State<ForezDirectoryScreen> {
}
void _openUserProfile(User user) =>
MainController.of(context).openUserPage(user.id);
MainController.of(context)!.openUserPage(user.id!);
}
class _ForezMemberTile extends StatelessWidget {
@ -135,11 +135,11 @@ class _ForezMemberTile extends StatelessWidget {
final Function(User) onTap;
const _ForezMemberTile({
Key key,
@required this.user,
@required this.member,
@required this.selectedAction,
@required this.onTap,
Key? key,
required this.user,
required this.member,
required this.selectedAction,
required this.onTap,
}) : super(key: key);
@override
@ -147,7 +147,7 @@ class _ForezMemberTile extends StatelessWidget {
leading: AccountImageWidget(user: user),
title: Text(user.fullName),
subtitle: Text(member.membershipText),
trailing: !member.isAtLeastMember && forezGroup.isAtLeastModerator
trailing: !member.isAtLeastMember && forezGroup!.isAtLeastModerator
? (member.isInvited
? _buildInvitedButton()
: _buildRequestedButton())
@ -155,7 +155,7 @@ class _ForezMemberTile extends StatelessWidget {
onTap: member.isAtLeastMember ? () => onTap(user) : null,
);
Widget _buildConversationButton() => user.id == userID()
Widget? _buildConversationButton() => user.id == userID()
? null
: IconButton(
icon: Icon(Icons.message),
@ -201,12 +201,12 @@ class _MembershipButton extends StatelessWidget {
final IconData icon;
const _MembershipButton({
Key key,
@required this.user,
@required this.action,
@required this.onTap,
@required this.color,
@required this.icon,
Key? key,
required this.user,
required this.action,
required this.onTap,
required this.color,
required this.icon,
}) : assert(user != null),
assert(action != null),
assert(onTap != null),