refactor: Make more widgets null safe

This commit is contained in:
Krille Fear 2021-11-19 20:38:16 +01:00
parent 3f10c0bae6
commit b73c6982a6
6 changed files with 54 additions and 38 deletions

View File

@ -1,3 +1,5 @@
//@dart=2.12
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@ -5,12 +7,12 @@ import 'package:fluffychat/utils/platform_infos.dart';
class AdaptiveFlatButton extends StatelessWidget {
final String label;
final Color textColor;
final Function onPressed;
final Color? textColor;
final void Function()? onPressed;
const AdaptiveFlatButton({
Key key,
@required this.label,
Key? key,
required this.label,
this.textColor,
this.onPressed,
}) : super(key: key);

View File

@ -1,3 +1,5 @@
//@dart=2.12
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
@ -8,12 +10,12 @@ import 'package:fluffychat/utils/string_color.dart';
import 'matrix.dart';
class Avatar extends StatelessWidget {
final Uri mxContent;
final String name;
final Uri? mxContent;
final String? name;
final double size;
final Function onTap;
final void Function()? onTap;
static const double defaultSize = 44;
final Client client;
final Client? client;
final double fontSize;
const Avatar(
@ -23,7 +25,7 @@ class Avatar extends StatelessWidget {
this.onTap,
this.client,
this.fontSize = 18,
Key key,
Key? key,
}) : super(key: key);
@override
@ -34,10 +36,13 @@ class Avatar extends StatelessWidget {
height: size * MediaQuery.of(context).devicePixelRatio,
);
var fallbackLetters = '@';
if ((name?.runes?.length ?? 0) >= 2) {
fallbackLetters = String.fromCharCodes(name.runes, 0, 2);
} else if ((name?.runes?.length ?? 0) == 1) {
fallbackLetters = name;
final name = this.name;
if (name != null) {
if (name.runes.length >= 2) {
fallbackLetters = String.fromCharCodes(name.runes, 0, 2);
} else if (name.runes.length == 1) {
fallbackLetters = name;
}
}
final noPic = mxContent == null ||
mxContent.toString().isEmpty ||

View File

@ -1,3 +1,5 @@
//@dart=2.12
import 'dart:async';
import 'package:flutter/material.dart';
@ -13,7 +15,7 @@ import 'matrix.dart';
class ChatSettingsPopupMenu extends StatefulWidget {
final Room room;
final bool displayChatDetails;
const ChatSettingsPopupMenu(this.room, this.displayChatDetails, {Key key})
const ChatSettingsPopupMenu(this.room, this.displayChatDetails, {Key? key})
: super(key: key);
@override
@ -21,7 +23,7 @@ class ChatSettingsPopupMenu extends StatefulWidget {
}
class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
StreamSubscription notificationChangeSub;
StreamSubscription? notificationChangeSub;
@override
void dispose() {
@ -37,7 +39,7 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
.stream
.where((u) => u.type == 'm.push_rules')
.listen(
(u) => setState(() => null),
(u) => setState(() {}),
);
final items = <PopupMenuEntry<String>>[
widget.room.pushRuleState == PushRuleState.notify
@ -47,7 +49,7 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
children: [
const Icon(Icons.notifications_off_outlined),
const SizedBox(width: 12),
Text(L10n.of(context).muteChat),
Text(L10n.of(context)!.muteChat),
],
),
)
@ -57,7 +59,7 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
children: [
const Icon(Icons.notifications_on_outlined),
const SizedBox(width: 12),
Text(L10n.of(context).unmuteChat),
Text(L10n.of(context)!.unmuteChat),
],
),
),
@ -67,7 +69,7 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
children: [
const Icon(Icons.delete_outlined),
const SizedBox(width: 12),
Text(L10n.of(context).leave),
Text(L10n.of(context)!.leave),
],
),
),
@ -81,7 +83,7 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
children: [
const Icon(Icons.info_outline_rounded),
const SizedBox(width: 12),
Text(L10n.of(context).chatDetails),
Text(L10n.of(context)!.chatDetails),
],
),
),
@ -94,9 +96,9 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
final confirmed = await showOkCancelAlertDialog(
useRootNavigator: false,
context: context,
title: L10n.of(context).areYouSure,
okLabel: L10n.of(context).ok,
cancelLabel: L10n.of(context).cancel,
title: L10n.of(context)!.areYouSure,
okLabel: L10n.of(context)!.ok,
cancelLabel: L10n.of(context)!.cancel,
);
if (confirmed == OkCancelResult.ok) {
final success = await showFutureLoadingDialog(

View File

@ -1,3 +1,5 @@
//@dart=2.12
import 'dart:async';
import 'package:flutter/material.dart';
@ -9,15 +11,15 @@ import '../utils/localized_exception_extension.dart';
import 'matrix.dart';
class ConnectionStatusHeader extends StatefulWidget {
const ConnectionStatusHeader({Key key}) : super(key: key);
const ConnectionStatusHeader({Key? key}) : super(key: key);
@override
_ConnectionStatusHeaderState createState() => _ConnectionStatusHeaderState();
}
class _ConnectionStatusHeaderState extends State<ConnectionStatusHeader> {
StreamSubscription _onSyncSub;
StreamSubscription _onSyncErrorSub;
StreamSubscription? _onSyncSub;
StreamSubscription? _onSyncErrorSub;
bool get _connected =>
DateTime.now().millisecondsSinceEpoch -
_lastSyncReceived.millisecondsSinceEpoch <
@ -82,14 +84,15 @@ extension on SyncStatusUpdate {
String toLocalizedString(BuildContext context) {
switch (status) {
case SyncStatus.waitingForResponse:
return L10n.of(context).loadingPleaseWait;
return L10n.of(context)!.loadingPleaseWait;
case SyncStatus.error:
return (error.exception as Object).toLocalizedString(context);
return ((error?.exception ?? Object()) as Object)
.toLocalizedString(context);
case SyncStatus.processing:
case SyncStatus.cleaningUp:
case SyncStatus.finished:
default:
return L10n.of(context).synchronizingPleaseWait;
return L10n.of(context)!.synchronizingPleaseWait;
}
}
}

View File

@ -1,3 +1,5 @@
//@dart=2.12
import 'dart:async';
import 'package:flutter/material.dart';
@ -14,15 +16,15 @@ class ContactsList extends StatefulWidget {
final TextEditingController searchController;
const ContactsList({
Key key,
@required this.searchController,
Key? key,
required this.searchController,
}) : super(key: key);
@override
_ContactsState createState() => _ContactsState();
}
class _ContactsState extends State<ContactsList> {
StreamSubscription _onSync;
StreamSubscription? _onSync;
@override
void dispose() {
@ -31,11 +33,11 @@ class _ContactsState extends State<ContactsList> {
}
DateTime _lastSetState = DateTime.now();
Timer _coolDown;
Timer? _coolDown;
void _updateView() {
_lastSetState = DateTime.now();
setState(() => null);
setState(() {});
}
@override
@ -68,15 +70,16 @@ class _ContactsState extends State<ContactsList> {
class _ContactListTile extends StatelessWidget {
final Presence contact;
const _ContactListTile({Key key, @required this.contact}) : super(key: key);
const _ContactListTile({Key? key, required this.contact}) : super(key: key);
@override
Widget build(BuildContext context) {
return FutureBuilder<Profile>(
future:
Matrix.of(context).client.getProfileFromUserId(contact.senderId),
builder: (context, snapshot) {
final displayname =
snapshot.data?.displayName ?? contact.senderId.localpart;
final displayname = snapshot.data?.displayName ??
contact.senderId.localpart ??
'No valid MXID';
final avatarUrl = snapshot.data?.avatarUrl;
return ListTile(
leading: SizedBox(
@ -108,7 +111,7 @@ class _ContactListTile extends StatelessWidget {
'rooms',
Matrix.of(context)
.client
.getDirectChatFromUserId(contact.senderId)
.getDirectChatFromUserId(contact.senderId)!
]),
);
});

View File

@ -1,4 +1,5 @@
//@dart=2.12
import 'package:flutter/material.dart';
import 'package:fluffychat/config/themes.dart';