Merge branch 'krille/update-dependenciess' into 'main'

chore: Update dependencies

See merge request famedly/fluffychat!985
This commit is contained in:
Krille Fear 2022-08-14 15:36:17 +00:00
commit 87cf9eee60
52 changed files with 163 additions and 175 deletions

View File

@ -12,7 +12,7 @@ linter:
analyzer: analyzer:
errors: errors:
todo: ignore todo: ignore
import_of_legacy_library_into_null_safe: ignore use_build_context_synchronously: ignore
exclude: exclude:
- lib/generated_plugin_registrant.dart - lib/generated_plugin_registrant.dart
- lib/l10n/*.dart - lib/l10n/*.dart

View File

@ -80,10 +80,10 @@ class FluffyChatApp extends StatefulWidget {
static bool gotInitialLink = false; static bool gotInitialLink = false;
@override @override
_FluffyChatAppState createState() => _FluffyChatAppState(); FluffyChatAppState createState() => FluffyChatAppState();
} }
class _FluffyChatAppState extends State<FluffyChatApp> { class FluffyChatAppState extends State<FluffyChatApp> {
GlobalKey<VRouterState>? _router; GlobalKey<VRouterState>? _router;
bool? columnMode; bool? columnMode;
String? _initialUrl; String? _initialUrl;

View File

@ -18,10 +18,10 @@ class InviteStoryPage extends StatefulWidget {
}) : super(key: key); }) : super(key: key);
@override @override
_InviteStoryPageState createState() => _InviteStoryPageState(); InviteStoryPageState createState() => InviteStoryPageState();
} }
class _InviteStoryPageState extends State<InviteStoryPage> { class InviteStoryPageState extends State<InviteStoryPage> {
Set<String> _undecided = {}; Set<String> _undecided = {};
final Set<String> _invite = {}; final Set<String> _invite = {};

View File

@ -39,10 +39,10 @@ class BootstrapDialog extends StatefulWidget {
); );
@override @override
_BootstrapDialogState createState() => _BootstrapDialogState(); BootstrapDialogState createState() => BootstrapDialogState();
} }
class _BootstrapDialogState extends State<BootstrapDialog> { class BootstrapDialogState extends State<BootstrapDialog> {
final TextEditingController _recoveryKeyTextEditingController = final TextEditingController _recoveryKeyTextEditingController =
TextEditingController(); TextEditingController();

View File

@ -75,6 +75,13 @@ class ChatInputRow extends StatelessWidget {
] ]
: <Widget>[ : <Widget>[
KeyBoardShortcuts( KeyBoardShortcuts(
keysToPress: {
LogicalKeyboardKey.altLeft,
LogicalKeyboardKey.keyA
},
onKeysPressed: () =>
controller.onAddPopupMenuButtonSelected('file'),
helpLabel: L10n.of(context)!.sendFile,
child: AnimatedContainer( child: AnimatedContainer(
duration: const Duration(milliseconds: 200), duration: const Duration(milliseconds: 200),
height: 56, height: 56,
@ -168,18 +175,17 @@ class ChatInputRow extends StatelessWidget {
], ],
), ),
), ),
keysToPress: {
LogicalKeyboardKey.altLeft,
LogicalKeyboardKey.keyA
},
onKeysPressed: () =>
controller.onAddPopupMenuButtonSelected('file'),
helpLabel: L10n.of(context)!.sendFile,
), ),
Container( Container(
height: 56, height: 56,
alignment: Alignment.center, alignment: Alignment.center,
child: KeyBoardShortcuts( child: KeyBoardShortcuts(
keysToPress: {
LogicalKeyboardKey.altLeft,
LogicalKeyboardKey.keyE
},
onKeysPressed: controller.emojiPickerAction,
helpLabel: L10n.of(context)!.emojis,
child: IconButton( child: IconButton(
tooltip: L10n.of(context)!.emojis, tooltip: L10n.of(context)!.emojis,
icon: PageTransitionSwitcher( icon: PageTransitionSwitcher(
@ -192,8 +198,8 @@ class ChatInputRow extends StatelessWidget {
animation: primaryAnimation, animation: primaryAnimation,
secondaryAnimation: secondaryAnimation, secondaryAnimation: secondaryAnimation,
transitionType: SharedAxisTransitionType.scaled, transitionType: SharedAxisTransitionType.scaled,
child: child,
fillColor: Colors.transparent, fillColor: Colors.transparent,
child: child,
); );
}, },
child: Icon( child: Icon(
@ -205,12 +211,6 @@ class ChatInputRow extends StatelessWidget {
), ),
onPressed: controller.emojiPickerAction, onPressed: controller.emojiPickerAction,
), ),
keysToPress: {
LogicalKeyboardKey.altLeft,
LogicalKeyboardKey.keyE
},
onKeysPressed: controller.emojiPickerAction,
helpLabel: L10n.of(context)!.emojis,
), ),
), ),
if (controller.matrix!.isMultiAccount && if (controller.matrix!.isMultiAccount &&

View File

@ -21,8 +21,8 @@ class CupertinoWidgetsBottomSheet extends StatelessWidget {
(widget) => Link( (widget) => Link(
builder: (context, callback) { builder: (context, callback) {
return CupertinoActionSheetAction( return CupertinoActionSheetAction(
child: Text(widget.name ?? widget.url),
onPressed: callback ?? () {}, onPressed: callback ?? () {},
child: Text(widget.name ?? widget.url),
); );
}, },
target: LinkTarget.blank, target: LinkTarget.blank,
@ -41,8 +41,8 @@ class CupertinoWidgetsBottomSheet extends StatelessWidget {
}, },
), ),
CupertinoActionSheetAction( CupertinoActionSheetAction(
child: Text(L10n.of(context)!.cancel),
onPressed: Navigator.of(context).pop, onPressed: Navigator.of(context).pop,
child: Text(L10n.of(context)!.cancel),
), ),
], ],
); );

View File

@ -14,10 +14,10 @@ class EncryptionButton extends StatefulWidget {
final Room room; final Room room;
const EncryptionButton(this.room, {Key? key}) : super(key: key); const EncryptionButton(this.room, {Key? key}) : super(key: key);
@override @override
_EncryptionButtonState createState() => _EncryptionButtonState(); EncryptionButtonState createState() => EncryptionButtonState();
} }
class _EncryptionButtonState extends State<EncryptionButton> { class EncryptionButtonState extends State<EncryptionButton> {
StreamSubscription? _onSyncSub; StreamSubscription? _onSyncSub;
void _enableEncryptionAction() async { void _enableEncryptionAction() async {

View File

@ -23,12 +23,12 @@ class AudioPlayerWidget extends StatefulWidget {
: super(key: key); : super(key: key);
@override @override
_AudioPlayerState createState() => _AudioPlayerState(); AudioPlayerState createState() => AudioPlayerState();
} }
enum AudioPlayerStatus { notDownloaded, downloading, downloaded } enum AudioPlayerStatus { notDownloaded, downloading, downloaded }
class _AudioPlayerState extends State<AudioPlayerWidget> { class AudioPlayerState extends State<AudioPlayerWidget> {
AudioPlayerStatus status = AudioPlayerStatus.notDownloaded; AudioPlayerStatus status = AudioPlayerStatus.notDownloaded;
final AudioPlayer audioPlayer = AudioPlayer(); final AudioPlayer audioPlayer = AudioPlayer();

View File

@ -87,10 +87,7 @@ class ReplyContent extends StatelessWidget {
future: displayEvent.fetchSenderUser(), future: displayEvent.fetchSenderUser(),
builder: (context, snapshot) { builder: (context, snapshot) {
return Text( return Text(
(snapshot.data?.calcDisplayname() ?? '${snapshot.data?.calcDisplayname() ?? displayEvent.senderFromMemoryOrFallback.calcDisplayname()}:',
displayEvent.senderFromMemoryOrFallback
.calcDisplayname()) +
':',
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(

View File

@ -13,10 +13,10 @@ class Sticker extends StatefulWidget {
const Sticker(this.event, {Key? key}) : super(key: key); const Sticker(this.event, {Key? key}) : super(key: key);
@override @override
_StickerState createState() => _StickerState(); StickerState createState() => StickerState();
} }
class _StickerState extends State<Sticker> { class StickerState extends State<Sticker> {
bool? animated; bool? animated;
@override @override

View File

@ -20,10 +20,10 @@ class EventVideoPlayer extends StatefulWidget {
const EventVideoPlayer(this.event, {Key? key}) : super(key: key); const EventVideoPlayer(this.event, {Key? key}) : super(key: key);
@override @override
_EventVideoPlayerState createState() => _EventVideoPlayerState(); EventVideoPlayerState createState() => EventVideoPlayerState();
} }
class _EventVideoPlayerState extends State<EventVideoPlayer> { class EventVideoPlayerState extends State<EventVideoPlayer> {
ChewieController? _chewieManager; ChewieController? _chewieManager;
bool _isDownloading = false; bool _isDownloading = false;
String? _networkUri; String? _networkUri;

View File

@ -226,7 +226,7 @@ class InputBar extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text('/' + command, Text('/$command',
style: const TextStyle(fontFamily: 'monospace')), style: const TextStyle(fontFamily: 'monospace')),
Text( Text(
hint, hint,
@ -319,14 +319,14 @@ class InputBar extends StatelessWidget {
: controller!.text.substring(controller!.selection.baseOffset + 1); : controller!.text.substring(controller!.selection.baseOffset + 1);
var insertText = ''; var insertText = '';
if (suggestion['type'] == 'command') { if (suggestion['type'] == 'command') {
insertText = suggestion['name']! + ' '; insertText = '${suggestion['name']!} ';
startText = replaceText.replaceAllMapped( startText = replaceText.replaceAllMapped(
RegExp(r'^(/\w*)$'), RegExp(r'^(/\w*)$'),
(Match m) => '/' + insertText, (Match m) => '/$insertText',
); );
} }
if (suggestion['type'] == 'emoji') { if (suggestion['type'] == 'emoji') {
insertText = suggestion['emoji']! + ' '; insertText = '${suggestion['emoji']!} ';
startText = replaceText.replaceAllMapped( startText = replaceText.replaceAllMapped(
suggestion['current_word']!, suggestion['current_word']!,
(Match m) => insertText, (Match m) => insertText,
@ -351,21 +351,21 @@ class InputBar extends StatelessWidget {
break; break;
} }
} }
insertText = ':${isUnique ? '' : insertPack! + '~'}$insertEmote: '; insertText = ':${isUnique ? '' : '${insertPack!}~'}$insertEmote: ';
startText = replaceText.replaceAllMapped( startText = replaceText.replaceAllMapped(
RegExp(r'(\s|^)(:(?:[-\w]+~)?[-\w]+)$'), RegExp(r'(\s|^)(:(?:[-\w]+~)?[-\w]+)$'),
(Match m) => '${m[1]}$insertText', (Match m) => '${m[1]}$insertText',
); );
} }
if (suggestion['type'] == 'user') { if (suggestion['type'] == 'user') {
insertText = suggestion['mention']! + ' '; insertText = '${suggestion['mention']!} ';
startText = replaceText.replaceAllMapped( startText = replaceText.replaceAllMapped(
RegExp(r'(\s|^)(@[-\w]+)$'), RegExp(r'(\s|^)(@[-\w]+)$'),
(Match m) => '${m[1]}$insertText', (Match m) => '${m[1]}$insertText',
); );
} }
if (suggestion['type'] == 'room') { if (suggestion['type'] == 'room') {
insertText = suggestion['mxid']! + ' '; insertText = '${suggestion['mxid']!} ';
startText = replaceText.replaceAllMapped( startText = replaceText.replaceAllMapped(
RegExp(r'(\s|^)(#[-\w]+)$'), RegExp(r'(\s|^)(#[-\w]+)$'),
(Match m) => '${m[1]}$insertText', (Match m) => '${m[1]}$insertText',
@ -401,9 +401,7 @@ class InputBar extends StatelessWidget {
final val = controller!.value; final val = controller!.value;
final selection = val.selection.start; final selection = val.selection.start;
final messageWithoutNewLine = final messageWithoutNewLine =
controller!.text.substring(0, val.selection.start) + '${controller!.text.substring(0, val.selection.start)}\n${controller!.text.substring(val.selection.end)}';
'\n' +
controller!.text.substring(val.selection.end);
controller!.value = TextEditingValue( controller!.value = TextEditingValue(
text: messageWithoutNewLine, text: messageWithoutNewLine,
selection: TextSelection.fromPosition( selection: TextSelection.fromPosition(

View File

@ -19,10 +19,10 @@ class RecordingDialog extends StatefulWidget {
}) : super(key: key); }) : super(key: key);
@override @override
_RecordingDialogState createState() => _RecordingDialogState(); RecordingDialogState createState() => RecordingDialogState();
} }
class _RecordingDialogState extends State<RecordingDialog> { class RecordingDialogState extends State<RecordingDialog> {
Timer? _recorderSubscription; Timer? _recorderSubscription;
Duration _duration = Duration.zero; Duration _duration = Duration.zero;

View File

@ -18,10 +18,10 @@ class SendFileDialog extends StatefulWidget {
}) : super(key: key); }) : super(key: key);
@override @override
_SendFileDialogState createState() => _SendFileDialogState(); SendFileDialogState createState() => SendFileDialogState();
} }
class _SendFileDialogState extends State<SendFileDialog> { class SendFileDialogState extends State<SendFileDialog> {
bool origImage = false; bool origImage = false;
/// Images smaller than 20kb don't need compression. /// Images smaller than 20kb don't need compression.
@ -92,7 +92,7 @@ class _SendFileDialogState extends State<SendFileDialog> {
), ),
InkWell( InkWell(
onTap: () => setState(() => origImage = !origImage), onTap: () => setState(() => origImage = !origImage),
child: Text(L10n.of(context)!.sendOriginal + ' ($sizeString)'), child: Text('${L10n.of(context)!.sendOriginal} ($sizeString)'),
), ),
], ],
) )

View File

@ -20,10 +20,10 @@ class SendLocationDialog extends StatefulWidget {
}) : super(key: key); }) : super(key: key);
@override @override
_SendLocationDialogState createState() => _SendLocationDialogState(); SendLocationDialogState createState() => SendLocationDialogState();
} }
class _SendLocationDialogState extends State<SendLocationDialog> { class SendLocationDialogState extends State<SendLocationDialog> {
bool disabled = false; bool disabled = false;
bool denied = false; bool denied = false;
bool isSending = false; bool isSending = false;
@ -54,19 +54,19 @@ class _SendLocationDialogState extends State<SendLocationDialog> {
return; return;
} }
try { try {
Position _position; Position position;
try { try {
_position = await Geolocator.getCurrentPosition( position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.best, desiredAccuracy: LocationAccuracy.best,
timeLimit: const Duration(seconds: 30), timeLimit: const Duration(seconds: 30),
); );
} on TimeoutException { } on TimeoutException {
_position = await Geolocator.getCurrentPosition( position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.medium, desiredAccuracy: LocationAccuracy.medium,
timeLimit: const Duration(seconds: 30), timeLimit: const Duration(seconds: 30),
); );
} }
setState(() => position = _position); setState(() => position = position);
} catch (e) { } catch (e) {
setState(() => error = e); setState(() => error = e);
} }

View File

@ -24,7 +24,7 @@ class StickerPickerDialogState extends State<StickerPickerDialog> {
final packSlugs = stickerPacks.keys.toList(); final packSlugs = stickerPacks.keys.toList();
// ignore: prefer_function_declarations_over_variables // ignore: prefer_function_declarations_over_variables
final _packBuilder = (BuildContext context, int packIndex) { final packBuilder = (BuildContext context, int packIndex) {
final pack = stickerPacks[packSlugs[packIndex]]!; final pack = stickerPacks[packSlugs[packIndex]]!;
final filteredImagePackImageEntried = pack.images.entries.toList(); final filteredImagePackImageEntried = pack.images.entries.toList();
if (searchFilter?.isNotEmpty ?? false) { if (searchFilter?.isNotEmpty ?? false) {
@ -128,7 +128,7 @@ class StickerPickerDialogState extends State<StickerPickerDialog> {
), ),
SliverList( SliverList(
delegate: SliverChildBuilderDelegate( delegate: SliverChildBuilderDelegate(
_packBuilder, packBuilder,
childCount: packSlugs.length, childCount: packSlugs.length,
)), )),
], ],

View File

@ -185,7 +185,7 @@ class ChatDetailsController extends State<ChatDetails> {
await showFutureLoadingDialog( await showFutureLoadingDialog(
context: context, context: context,
future: () => future: () =>
room.client.setRoomAlias('#' + input.single + ':' + domain!, room.id), room.client.setRoomAlias('#${input.single}:${domain!}', room.id),
); );
} }

View File

@ -52,9 +52,8 @@ class ChatEncryptionSettingsView extends StatelessWidget {
builder: (BuildContext context, snapshot) { builder: (BuildContext context, snapshot) {
if (snapshot.hasError) { if (snapshot.hasError) {
return Center( return Center(
child: Text(L10n.of(context)!.oopsSomethingWentWrong + child: Text(
': ' + '${L10n.of(context)!.oopsSomethingWentWrong}: ${snapshot.error}'),
snapshot.error.toString()),
); );
} }
if (!snapshot.hasData) { if (!snapshot.hasData) {

View File

@ -160,11 +160,11 @@ class _ChatListViewBodyState extends State<ChatListViewBody> {
child: ListTile( child: ListTile(
leading: CircleAvatar( leading: CircleAvatar(
radius: Avatar.defaultSize / 2, radius: Avatar.defaultSize / 2,
child: const Icon(Icons.enhanced_encryption_outlined),
backgroundColor: backgroundColor:
Theme.of(context).colorScheme.surfaceVariant, Theme.of(context).colorScheme.surfaceVariant,
foregroundColor: foregroundColor:
Theme.of(context).colorScheme.onSurfaceVariant, Theme.of(context).colorScheme.onSurfaceVariant,
child: const Icon(Icons.enhanced_encryption_outlined),
), ),
title: Text( title: Text(
(Matrix.of(context) (Matrix.of(context)
@ -402,6 +402,7 @@ class _SpaceRoomListTopBarState extends State<SpaceRoomListTopBar> {
child: Column( child: Column(
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.all(8),
child: LinkText( child: LinkText(
text: (widget.controller.activeSpacesEntry as SpaceSpacesEntry) text: (widget.controller.activeSpacesEntry as SpaceSpacesEntry)
.space .space
@ -414,7 +415,6 @@ class _SpaceRoomListTopBarState extends State<SpaceRoomListTopBar> {
), ),
onLinkTap: (url) => UrlLauncher(context, url).launchUrl(), onLinkTap: (url) => UrlLauncher(context, url).launchUrl(),
), ),
padding: const EdgeInsets.all(8),
), ),
const Divider(), const Divider(),
], ],

View File

@ -4,7 +4,6 @@ import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:future_loading_dialog/future_loading_dialog.dart';
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
import 'package:pedantic/pedantic.dart';
import 'package:vrouter/vrouter.dart'; import 'package:vrouter/vrouter.dart';
import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/app_config.dart';
@ -108,7 +107,7 @@ class ChatListItem extends StatelessWidget {
), ),
); );
} else { } else {
unawaited(room.sendEvent(Matrix.of(context).shareContent!)); room.sendEvent(Matrix.of(context).shareContent!);
} }
Matrix.of(context).shareContent = null; Matrix.of(context).shareContent = null;
} }

View File

@ -37,8 +37,6 @@ class ChatListView extends StatelessWidget {
bottomNavigationBar: const ConnectionStatusHeader(), bottomNavigationBar: const ConnectionStatusHeader(),
floatingActionButton: selectMode == SelectMode.normal floatingActionButton: selectMode == SelectMode.normal
? KeyBoardShortcuts( ? KeyBoardShortcuts(
child:
StartChatFloatingActionButton(controller: controller),
keysToPress: { keysToPress: {
LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.controlLeft,
LogicalKeyboardKey.keyN LogicalKeyboardKey.keyN
@ -46,6 +44,8 @@ class ChatListView extends StatelessWidget {
onKeysPressed: () => onKeysPressed: () =>
VRouter.of(context).to('/newprivatechat'), VRouter.of(context).to('/newprivatechat'),
helpLabel: L10n.of(context)!.newChat, helpLabel: L10n.of(context)!.newChat,
child:
StartChatFloatingActionButton(controller: controller),
) )
: null, : null,
), ),

View File

@ -107,23 +107,22 @@ class ClientChooserButton extends StatelessWidget {
...List.generate( ...List.generate(
clientCount, clientCount,
(index) => KeyBoardShortcuts( (index) => KeyBoardShortcuts(
child: Container(),
keysToPress: _buildKeyboardShortcut(index + 1), keysToPress: _buildKeyboardShortcut(index + 1),
helpLabel: L10n.of(context)!.switchToAccount(index + 1), helpLabel: L10n.of(context)!.switchToAccount(index + 1),
onKeysPressed: () => _handleKeyboardShortcut(matrix, index), onKeysPressed: () => _handleKeyboardShortcut(matrix, index),
child: Container(),
), ),
), ),
KeyBoardShortcuts( KeyBoardShortcuts(
child: Container(),
keysToPress: { keysToPress: {
LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.controlLeft,
LogicalKeyboardKey.tab LogicalKeyboardKey.tab
}, },
helpLabel: L10n.of(context)!.nextAccount, helpLabel: L10n.of(context)!.nextAccount,
onKeysPressed: () => _nextAccount(matrix), onKeysPressed: () => _nextAccount(matrix),
child: Container(),
), ),
KeyBoardShortcuts( KeyBoardShortcuts(
child: Container(),
keysToPress: { keysToPress: {
LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.controlLeft,
LogicalKeyboardKey.shiftLeft, LogicalKeyboardKey.shiftLeft,
@ -131,8 +130,11 @@ class ClientChooserButton extends StatelessWidget {
}, },
helpLabel: L10n.of(context)!.previousAccount, helpLabel: L10n.of(context)!.previousAccount,
onKeysPressed: () => _previousAccount(matrix), onKeysPressed: () => _previousAccount(matrix),
child: Container(),
), ),
PopupMenuButton<Object>( PopupMenuButton<Object>(
onSelected: _clientSelected,
itemBuilder: _bundleMenuItems,
child: Material( child: Material(
color: Colors.transparent, color: Colors.transparent,
borderRadius: BorderRadius.circular(99), borderRadius: BorderRadius.circular(99),
@ -144,8 +146,6 @@ class ClientChooserButton extends StatelessWidget {
fontSize: 12, fontSize: 12,
), ),
), ),
onSelected: _clientSelected,
itemBuilder: _bundleMenuItems,
), ),
], ],
), ),

View File

@ -44,12 +44,12 @@ class RecommendedRoomListItem extends StatelessWidget {
TextSpan(children: [ TextSpan(children: [
WidgetSpan( WidgetSpan(
child: Tooltip( child: Tooltip(
message: L10n.of(context)!
.numberRoomMembers(room.numJoinedMembers),
child: const Icon( child: const Icon(
Icons.people_outlined, Icons.people_outlined,
size: 20, size: 20,
), ),
message: L10n.of(context)!
.numberRoomMembers(room.numJoinedMembers),
), ),
alignment: PlaceholderAlignment.middle, alignment: PlaceholderAlignment.middle,
baseline: TextBaseline.alphabetic), baseline: TextBaseline.alphabetic),

View File

@ -23,10 +23,10 @@ class SpacesDrawerEntry extends StatelessWidget {
final active = controller.activeSpacesEntry == entry.spacesEntry; final active = controller.activeSpacesEntry == entry.spacesEntry;
final leading = room == null final leading = room == null
? CircleAvatar( ? CircleAvatar(
child: space.getIcon(active),
radius: Avatar.defaultSize / 2, radius: Avatar.defaultSize / 2,
backgroundColor: Theme.of(context).colorScheme.secondary, backgroundColor: Theme.of(context).colorScheme.secondary,
foregroundColor: Theme.of(context).colorScheme.onSecondary, foregroundColor: Theme.of(context).colorScheme.onSecondary,
child: space.getIcon(active),
) )
: Avatar( : Avatar(
mxContent: room.avatar, mxContent: room.avatar,

View File

@ -133,8 +133,8 @@ class _SpacesHierarchyProposalsState extends State<SpacesHierarchyProposals> {
animation: primaryAnimation, animation: primaryAnimation,
secondaryAnimation: secondaryAnimation, secondaryAnimation: secondaryAnimation,
transitionType: SharedAxisTransitionType.scaled, transitionType: SharedAxisTransitionType.scaled,
child: child,
fillColor: Colors.transparent, fillColor: Colors.transparent,
child: child,
); );
}, },
layoutBuilder: (children) => Stack( layoutBuilder: (children) => Stack(

View File

@ -26,8 +26,8 @@ class StartChatFloatingActionButton extends StatelessWidget {
animation: primaryAnimation, animation: primaryAnimation,
secondaryAnimation: secondaryAnimation, secondaryAnimation: secondaryAnimation,
transitionType: SharedAxisTransitionType.horizontal, transitionType: SharedAxisTransitionType.horizontal,
child: child,
fillColor: Colors.transparent, fillColor: Colors.transparent,
child: child,
); );
}, },
layoutBuilder: (children) => Stack( layoutBuilder: (children) => Stack(

View File

@ -131,8 +131,8 @@ class ConnectPageController extends State<ConnectPage> {
void ssoLoginAction(String id) async { void ssoLoginAction(String id) async {
final redirectUrl = kIsWeb final redirectUrl = kIsWeb
? html.window.origin! + '/web/auth.html' ? '${html.window.origin!}/web/auth.html'
: AppConfig.appOpenUrlScheme.toLowerCase() + '://login'; : '${AppConfig.appOpenUrlScheme.toLowerCase()}://login';
final url = final url =
'${Matrix.of(context).getLoginClient().homeserver?.toString()}/_matrix/client/r0/login/sso/redirect/${Uri.encodeComponent(id)}?redirectUrl=${Uri.encodeQueryComponent(redirectUrl)}'; '${Matrix.of(context).getLoginClient().homeserver?.toString()}/_matrix/client/r0/login/sso/redirect/${Uri.encodeComponent(id)}?redirectUrl=${Uri.encodeQueryComponent(redirectUrl)}';
final urlScheme = Uri.parse(redirectUrl).scheme; final urlScheme = Uri.parse(redirectUrl).scheme;

View File

@ -25,7 +25,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart';
import 'package:just_audio/just_audio.dart'; import 'package:just_audio/just_audio.dart';
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
import 'package:pedantic/pedantic.dart';
import 'package:wakelock/wakelock.dart'; import 'package:wakelock/wakelock.dart';
import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/platform_infos.dart';
@ -121,10 +120,10 @@ class Calling extends StatefulWidget {
: super(key: key); : super(key: key);
@override @override
_MyCallingPage createState() => _MyCallingPage(); MyCallingPage createState() => MyCallingPage();
} }
class _MyCallingPage extends State<Calling> { class MyCallingPage extends State<Calling> {
Room? get room => call?.room; Room? get room => call?.room;
String get displayName => call?.displayName ?? ''; String get displayName => call?.displayName ?? '';

View File

@ -39,10 +39,10 @@ class KeyVerificationDialog extends StatefulWidget {
}) : super(key: key); }) : super(key: key);
@override @override
_KeyVerificationPageState createState() => _KeyVerificationPageState(); KeyVerificationPageState createState() => KeyVerificationPageState();
} }
class _KeyVerificationPageState extends State<KeyVerificationDialog> { class KeyVerificationPageState extends State<KeyVerificationDialog> {
void Function()? originalOnUpdate; void Function()? originalOnUpdate;
late final List<dynamic> sasEmoji; late final List<dynamic> sasEmoji;

View File

@ -12,10 +12,10 @@ class QrScannerModal extends StatefulWidget {
const QrScannerModal({Key? key}) : super(key: key); const QrScannerModal({Key? key}) : super(key: key);
@override @override
_QrScannerModalState createState() => _QrScannerModalState(); QrScannerModalState createState() => QrScannerModalState();
} }
class _QrScannerModalState extends State<QrScannerModal> { class QrScannerModalState extends State<QrScannerModal> {
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
QRViewController? controller; QRViewController? controller;

View File

@ -210,7 +210,7 @@ class StoryPageController extends State<StoryPage> {
final tmpDirectory = await getTemporaryDirectory(); final tmpDirectory = await getTemporaryDirectory();
final fileName = final fileName =
event.content.tryGet<String>('filename') ?? 'unknown_story_video.mp4'; event.content.tryGet<String>('filename') ?? 'unknown_story_video.mp4';
final file = File(tmpDirectory.path + '/' + fileName); final file = File('${tmpDirectory.path}/$fileName');
await file.writeAsBytes(matrixFile.bytes); await file.writeAsBytes(matrixFile.bytes);
if (!mounted) return null; if (!mounted) return null;
final videoPlayerController = final videoPlayerController =

View File

@ -29,15 +29,14 @@ class UserBottomSheet extends StatefulWidget {
class UserBottomSheetController extends State<UserBottomSheet> { class UserBottomSheetController extends State<UserBottomSheet> {
void participantAction(String action) async { void participantAction(String action) async {
// ignore: prefer_function_declarations_over_variables // ignore: prefer_function_declarations_over_variables
final Function _askConfirmation = final Function askConfirmation = () async => (await showOkCancelAlertDialog(
() async => (await showOkCancelAlertDialog( useRootNavigator: false,
useRootNavigator: false, context: context,
context: context, title: L10n.of(context)!.areYouSure,
title: L10n.of(context)!.areYouSure, okLabel: L10n.of(context)!.yes,
okLabel: L10n.of(context)!.yes, cancelLabel: L10n.of(context)!.no,
cancelLabel: L10n.of(context)!.no, ) ==
) == OkCancelResult.ok);
OkCancelResult.ok);
switch (action) { switch (action) {
case 'report': case 'report':
final event = widget.user; final event = widget.user;
@ -88,7 +87,7 @@ class UserBottomSheetController extends State<UserBottomSheet> {
widget.onMention!(); widget.onMention!();
break; break;
case 'ban': case 'ban':
if (await _askConfirmation()) { if (await askConfirmation()) {
await showFutureLoadingDialog( await showFutureLoadingDialog(
context: context, context: context,
future: () => widget.user.ban(), future: () => widget.user.ban(),
@ -97,7 +96,7 @@ class UserBottomSheetController extends State<UserBottomSheet> {
} }
break; break;
case 'unban': case 'unban':
if (await _askConfirmation()) { if (await askConfirmation()) {
await showFutureLoadingDialog( await showFutureLoadingDialog(
context: context, context: context,
future: () => widget.user.unban(), future: () => widget.user.unban(),
@ -106,7 +105,7 @@ class UserBottomSheetController extends State<UserBottomSheet> {
} }
break; break;
case 'kick': case 'kick':
if (await _askConfirmation()) { if (await askConfirmation()) {
await showFutureLoadingDialog( await showFutureLoadingDialog(
context: context, context: context,
future: () => widget.user.kick(), future: () => widget.user.kick(),
@ -120,7 +119,7 @@ class UserBottomSheetController extends State<UserBottomSheet> {
currentLevel: widget.user.powerLevel, currentLevel: widget.user.powerLevel,
); );
if (newPermission != null) { if (newPermission != null) {
if (newPermission == 100 && await _askConfirmation() == false) break; if (newPermission == 100 && await askConfirmation() == false) break;
await showFutureLoadingDialog( await showFutureLoadingDialog(
context: context, context: context,
future: () => widget.user.setPower(newPermission), future: () => widget.user.setPower(newPermission),
@ -139,7 +138,7 @@ class UserBottomSheetController extends State<UserBottomSheet> {
Navigator.of(context, rootNavigator: false).pop(); Navigator.of(context, rootNavigator: false).pop();
break; break;
case 'ignore': case 'ignore':
if (await _askConfirmation()) { if (await askConfirmation()) {
await showFutureLoadingDialog( await showFutureLoadingDialog(
context: context, context: context,
future: () => future: () =>

View File

@ -104,10 +104,13 @@ class BackgroundPush {
} }
factory BackgroundPush( factory BackgroundPush(
Client _client, BuildContext _context, GlobalKey<VRouterState>? router, Client client,
{final void Function(String errorMsg, {Uri? link})? onFcmError}) { BuildContext context,
final instance = BackgroundPush.clientOnly(_client); GlobalKey<VRouterState>? router, {
instance.context = _context; final void Function(String errorMsg, {Uri? link})? onFcmError,
}) {
final instance = BackgroundPush.clientOnly(client);
instance.context = context;
// ignore: prefer_initializing_formals // ignore: prefer_initializing_formals
instance.router = router; instance.router = router;
// ignore: prefer_initializing_formals // ignore: prefer_initializing_formals
@ -341,9 +344,9 @@ class BackgroundPush {
} }
} catch (e) { } catch (e) {
Logs().i( Logs().i(
'[Push] No self-hosted unified push gateway present: ' + newEndpoint); '[Push] No self-hosted unified push gateway present: $newEndpoint');
} }
Logs().i('[Push] UnifiedPush using endpoint ' + endpoint); Logs().i('[Push] UnifiedPush using endpoint $endpoint');
final oldTokens = <String?>{}; final oldTokens = <String?>{};
try { try {
final fcmToken = await firebase?.getToken(); final fcmToken = await firebase?.getToken();

View File

@ -23,10 +23,10 @@ class FluffyEmojiPickerView extends EmojiPickerBuilder {
: super(config, state); : super(config, state);
@override @override
_DefaultEmojiPickerViewState createState() => _DefaultEmojiPickerViewState(); DefaultEmojiPickerViewState createState() => DefaultEmojiPickerViewState();
} }
class _DefaultEmojiPickerViewState extends State<FluffyEmojiPickerView> class DefaultEmojiPickerViewState extends State<FluffyEmojiPickerView>
with SingleTickerProviderStateMixin { with SingleTickerProviderStateMixin {
PageController? _pageController; PageController? _pageController;
TabController? _tabController; TabController? _tabController;
@ -267,12 +267,12 @@ class _DefaultEmojiPickerViewState extends State<FluffyEmojiPickerView>
return TextButton( return TextButton(
onPressed: onPressed, onPressed: onPressed,
onLongPress: onLongPressed, onLongPress: onLongPressed,
child: child,
style: ButtonStyle( style: ButtonStyle(
padding: MaterialStateProperty.all(EdgeInsets.zero), padding: MaterialStateProperty.all(EdgeInsets.zero),
minimumSize: MaterialStateProperty.all(Size.zero), minimumSize: MaterialStateProperty.all(Size.zero),
tapTargetSize: MaterialTapTargetSize.shrinkWrap, tapTargetSize: MaterialTapTargetSize.shrinkWrap,
), ),
child: child,
); );
} }
return GestureDetector( return GestureDetector(

View File

@ -1,3 +1,5 @@
// ignore_for_file: depend_on_referenced_packages
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';

View File

@ -33,15 +33,15 @@ Future<void> pushHelper(
Logs().wtf('Push Helper has crashed!', e, s); Logs().wtf('Push Helper has crashed!', e, s);
// Initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project // Initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project
final _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
await _flutterLocalNotificationsPlugin.initialize( await flutterLocalNotificationsPlugin.initialize(
const InitializationSettings( const InitializationSettings(
android: AndroidInitializationSettings('notifications_icon'), android: AndroidInitializationSettings('notifications_icon'),
iOS: IOSInitializationSettings(), iOS: IOSInitializationSettings(),
), ),
onSelectNotification: onSelectNotification, onSelectNotification: onSelectNotification,
); );
_flutterLocalNotificationsPlugin.show( flutterLocalNotificationsPlugin.show(
0, 0,
l10n?.newMessageInFluffyChat, l10n?.newMessageInFluffyChat,
l10n?.openAppToReadMessages, l10n?.openAppToReadMessages,
@ -83,8 +83,8 @@ Future<void> _tryPushHelper(
} }
// Initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project // Initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project
final _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
await _flutterLocalNotificationsPlugin.initialize( await flutterLocalNotificationsPlugin.initialize(
const InitializationSettings( const InitializationSettings(
android: AndroidInitializationSettings('notifications_icon'), android: AndroidInitializationSettings('notifications_icon'),
iOS: IOSInitializationSettings(), iOS: IOSInitializationSettings(),
@ -102,7 +102,7 @@ Future<void> _tryPushHelper(
Logs().v('Notification is a clearing indicator.'); Logs().v('Notification is a clearing indicator.');
if (notification.counts?.unread == 0) { if (notification.counts?.unread == 0) {
if (notification.counts == null || notification.counts?.unread == 0) { if (notification.counts == null || notification.counts?.unread == 0) {
await _flutterLocalNotificationsPlugin.cancelAll(); await flutterLocalNotificationsPlugin.cancelAll();
final store = await SharedPreferences.getInstance(); final store = await SharedPreferences.getInstance();
await store.setString( await store.setString(
SettingKeys.notificationCurrentIds, json.encode({})); SettingKeys.notificationCurrentIds, json.encode({}));
@ -185,7 +185,7 @@ Future<void> _tryPushHelper(
iOS: iOSPlatformChannelSpecifics, iOS: iOSPlatformChannelSpecifics,
); );
await _flutterLocalNotificationsPlugin.show( await flutterLocalNotificationsPlugin.show(
id, id,
event.room.displayname, event.room.displayname,
body, body,

View File

@ -15,7 +15,7 @@ extension ResizeImage on MatrixFile {
Future<MatrixVideoFile> resizeVideo() async { Future<MatrixVideoFile> resizeVideo() async {
final tmpDir = await getTemporaryDirectory(); final tmpDir = await getTemporaryDirectory();
final tmpFile = File(tmpDir.path + '/' + name); final tmpFile = File('${tmpDir.path}/$name');
MediaInfo? mediaInfo; MediaInfo? mediaInfo;
await tmpFile.writeAsBytes(bytes); await tmpFile.writeAsBytes(bytes);
try { try {
@ -37,7 +37,7 @@ extension ResizeImage on MatrixFile {
Future<MatrixImageFile?> getVideoThumbnail() async { Future<MatrixImageFile?> getVideoThumbnail() async {
if (!PlatformInfos.isMobile) return null; if (!PlatformInfos.isMobile) return null;
final tmpDir = await getTemporaryDirectory(); final tmpDir = await getTemporaryDirectory();
final tmpFile = File(tmpDir.path + '/' + name); final tmpFile = File('${tmpDir.path}/$name');
if (await tmpFile.exists() == false) { if (await tmpFile.exists() == false) {
await tmpFile.writeAsBytes(bytes); await tmpFile.writeAsBytes(bytes);
} }

View File

@ -1,13 +0,0 @@
import 'dart:async';
import 'package:isolate/isolate.dart';
Future<T> runInBackground<T, U>(
FutureOr<T> Function(U arg) function, U arg) async {
final isolate = await IsolateRunner.spawn();
try {
return await isolate.run(function, arg);
} finally {
await isolate.close();
}
}

View File

@ -9,9 +9,9 @@ extension StreamExtension on Stream {
var gotMessage = false; var gotMessage = false;
// as we call our inline-defined function recursively we need to make sure that the // as we call our inline-defined function recursively we need to make sure that the
// variable exists prior of creating the function. Silly dart. // variable exists prior of creating the function. Silly dart.
Function? _onMessage; Function? onMessage;
// callback to determine if we should send out an update // callback to determine if we should send out an update
_onMessage = () { onMessage = () {
// do nothing if it is already closed // do nothing if it is already closed
if (controller.isClosed) { if (controller.isClosed) {
return; return;
@ -25,7 +25,7 @@ extension StreamExtension on Stream {
// method to send out an update! // method to send out an update!
timer = null; timer = null;
if (gotMessage) { if (gotMessage) {
_onMessage?.call(); onMessage?.call();
} }
}); });
} else { } else {
@ -33,7 +33,7 @@ extension StreamExtension on Stream {
gotMessage = true; gotMessage = true;
} }
}; };
final subscription = listen((_) => _onMessage?.call(), final subscription = listen((_) => onMessage?.call(),
onDone: () => controller.close(), onDone: () => controller.close(),
onError: (e, s) => controller.addError(e, s)); onError: (e, s) => controller.addError(e, s));
// add proper cleanup to the subscription and the controller, to not memory leak // add proper cleanup to the subscription and the controller, to not memory leak

View File

@ -80,8 +80,8 @@ extension UiaRequestManager on MatrixState {
), ),
); );
default: default:
final url = Uri.parse(client.homeserver.toString() + final url = Uri.parse(
'/_matrix/client/r0/auth/$stage/fallback/web?session=${uiaRequest.session}'); '${client.homeserver}/_matrix/client/r0/auth/$stage/fallback/web?session=${uiaRequest.session}');
launch( launch(
url.toString(), url.toString(),
forceSafariVC: true, forceSafariVC: true,

View File

@ -82,7 +82,7 @@ class UpdateCheckerNoStore {
final dir = await getTemporaryDirectory(); final dir = await getTemporaryDirectory();
final response = await get(downloadUri(metadata)); final response = await get(downloadUri(metadata));
if (response.statusCode == 200) { if (response.statusCode == 200) {
final file = File(dir.path + '/fluffychat.msix'); final file = File('${dir.path}/fluffychat.msix');
await file.writeAsBytes(response.bodyBytes); await file.writeAsBytes(response.bodyBytes);
Process.start(file.path, [], runInShell: true); Process.start(file.path, [], runInShell: true);
} else { } else {

View File

@ -80,7 +80,7 @@ class UrlLauncher {
final newHost = uri.host.split('.').map((hostPartEncoded) { final newHost = uri.host.split('.').map((hostPartEncoded) {
final hostPart = Uri.decodeComponent(hostPartEncoded); final hostPart = Uri.decodeComponent(hostPartEncoded);
final hostPartPunycode = punycodeEncode(hostPart); final hostPartPunycode = punycodeEncode(hostPart);
return hostPartPunycode != hostPart + '-' return hostPartPunycode != '$hostPart-'
? 'xn--$hostPartPunycode' ? 'xn--$hostPartPunycode'
: hostPart; : hostPart;
}).join('.'); }).join('.');

View File

@ -24,10 +24,10 @@ class ChatSettingsPopupMenu extends StatefulWidget {
: super(key: key); : super(key: key);
@override @override
_ChatSettingsPopupMenuState createState() => _ChatSettingsPopupMenuState(); ChatSettingsPopupMenuState createState() => ChatSettingsPopupMenuState();
} }
class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> { class ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
StreamSubscription? notificationChangeSub; StreamSubscription? notificationChangeSub;
@override @override
@ -108,22 +108,22 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
KeyBoardShortcuts( KeyBoardShortcuts(
child: Container(),
keysToPress: { keysToPress: {
LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.controlLeft,
LogicalKeyboardKey.keyI LogicalKeyboardKey.keyI
}, },
helpLabel: L10n.of(context)!.chatDetails, helpLabel: L10n.of(context)!.chatDetails,
onKeysPressed: _showChatDetails, onKeysPressed: _showChatDetails,
child: Container(),
), ),
KeyBoardShortcuts( KeyBoardShortcuts(
child: Container(),
keysToPress: { keysToPress: {
LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.controlLeft,
LogicalKeyboardKey.keyW LogicalKeyboardKey.keyW
}, },
helpLabel: L10n.of(context)!.matrixWidgets, helpLabel: L10n.of(context)!.matrixWidgets,
onKeysPressed: _showWidgets, onKeysPressed: _showWidgets,
child: Container(),
), ),
PopupMenuButton( PopupMenuButton(
onSelected: (String choice) async { onSelected: (String choice) async {

View File

@ -12,10 +12,10 @@ class ConnectionStatusHeader extends StatefulWidget {
const ConnectionStatusHeader({Key? key}) : super(key: key); const ConnectionStatusHeader({Key? key}) : super(key: key);
@override @override
_ConnectionStatusHeaderState createState() => _ConnectionStatusHeaderState(); ConnectionStatusHeaderState createState() => ConnectionStatusHeaderState();
} }
class _ConnectionStatusHeaderState extends State<ConnectionStatusHeader> { class ConnectionStatusHeaderState extends State<ConnectionStatusHeader> {
late final StreamSubscription _onSyncSub; late final StreamSubscription _onSyncSub;
@override @override

View File

@ -8,7 +8,7 @@ class EmptyPage extends StatelessWidget {
const EmptyPage({this.loading = false, Key? key}) : super(key: key); const EmptyPage({this.loading = false, Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final _width = min(MediaQuery.of(context).size.width, EmptyPage._width); final width = min(MediaQuery.of(context).size.width, EmptyPage._width);
return Scaffold( return Scaffold(
// Add invisible appbar to make status bar on Android tablets bright. // Add invisible appbar to make status bar on Android tablets bright.
appBar: AppBar( appBar: AppBar(
@ -25,15 +25,15 @@ class EmptyPage extends StatelessWidget {
tag: 'info-logo', tag: 'info-logo',
child: Image.asset( child: Image.asset(
'assets/info-logo.png', 'assets/info-logo.png',
width: _width, width: width,
height: _width, height: width,
), ),
), ),
), ),
if (loading) if (loading)
Center( Center(
child: SizedBox( child: SizedBox(
width: _width, width: width,
child: const LinearProgressIndicator(), child: const LinearProgressIndicator(),
), ),
), ),

View File

@ -15,10 +15,10 @@ class LockScreen extends StatefulWidget {
const LockScreen({Key? key}) : super(key: key); const LockScreen({Key? key}) : super(key: key);
@override @override
_LockScreenState createState() => _LockScreenState(); LockScreenState createState() => LockScreenState();
} }
class _LockScreenState extends State<LockScreen> { class LockScreenState extends State<LockScreen> {
final TextEditingController _textEditingController = TextEditingController(); final TextEditingController _textEditingController = TextEditingController();
final FocusNode _focusNode = FocusNode(); final FocusNode _focusNode = FocusNode();
bool _wrongInput = false; bool _wrongInput = false;

View File

@ -6,10 +6,10 @@ class LogViewer extends StatefulWidget {
const LogViewer({Key? key}) : super(key: key); const LogViewer({Key? key}) : super(key: key);
@override @override
_LogViewerState createState() => _LogViewerState(); LogViewerState createState() => LogViewerState();
} }
class _LogViewerState extends State<LogViewer> { class LogViewerState extends State<LogViewer> {
Level logLevel = Level.debug; Level logLevel = Level.debug;
double fontSize = 14; double fontSize = 14;
@override @override

View File

@ -17,10 +17,10 @@ class SettingsSwitchListTile extends StatefulWidget {
}) : super(key: key); }) : super(key: key);
@override @override
_SettingsSwitchListTileState createState() => _SettingsSwitchListTileState(); SettingsSwitchListTileState createState() => SettingsSwitchListTileState();
} }
class _SettingsSwitchListTileState extends State<SettingsSwitchListTile> { class SettingsSwitchListTileState extends State<SettingsSwitchListTile> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return FutureBuilder<bool>( return FutureBuilder<bool>(

View File

@ -579,7 +579,7 @@ packages:
name: flutter_lints name: flutter_lints
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.4" version: "2.0.1"
flutter_local_notifications: flutter_local_notifications:
dependency: "direct main" dependency: "direct main"
description: description:
@ -612,7 +612,7 @@ packages:
name: flutter_map name: flutter_map
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "2.2.0"
flutter_math_fork: flutter_math_fork:
dependency: transitive dependency: transitive
description: description:
@ -712,7 +712,7 @@ packages:
name: flutter_slidable name: flutter_slidable
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "2.0.0"
flutter_svg: flutter_svg:
dependency: "direct main" dependency: "direct main"
description: description:
@ -750,7 +750,7 @@ packages:
name: flutter_webrtc name: flutter_webrtc
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.8.7" version: "0.9.2"
frontend_server_client: frontend_server_client:
dependency: transitive dependency: transitive
description: description:
@ -834,12 +834,12 @@ packages:
source: hosted source: hosted
version: "0.7.0" version: "0.7.0"
hive: hive:
dependency: transitive dependency: "direct main"
description: description:
name: hive name: hive
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.1" version: "2.2.3"
hive_flutter: hive_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
@ -988,7 +988,7 @@ packages:
source: git source: git
version: "0.1.4" version: "0.1.4"
latlong2: latlong2:
dependency: transitive dependency: "direct main"
description: description:
name: latlong2 name: latlong2
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
@ -1000,7 +1000,7 @@ packages:
name: lints name: lints
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "2.0.0"
lists: lists:
dependency: transitive dependency: transitive
description: description:
@ -1912,7 +1912,7 @@ packages:
source: hosted source: hosted
version: "0.2.0" version: "0.2.0"
uuid: uuid:
dependency: transitive dependency: "direct main"
description: description:
name: uuid name: uuid
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
@ -2059,12 +2059,12 @@ packages:
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
webrtc_interface: webrtc_interface:
dependency: transitive dependency: "direct main"
description: description:
name: webrtc_interface name: webrtc_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.4" version: "1.0.7"
win32: win32:
dependency: transitive dependency: transitive
description: description:

View File

@ -38,20 +38,21 @@ dependencies:
flutter_local_notifications: ^9.7.0 flutter_local_notifications: ^9.7.0
flutter_localizations: flutter_localizations:
sdk: flutter sdk: flutter
flutter_map: ^1.1.0 flutter_map: ^2.2.0
flutter_matrix_html: ^1.1.0 flutter_matrix_html: ^1.1.0
flutter_olm: ^1.2.0 flutter_olm: ^1.2.0
flutter_openssl_crypto: ^0.1.0 flutter_openssl_crypto: ^0.1.0
flutter_ringtone_player: ^3.1.1 flutter_ringtone_player: ^3.1.1
flutter_secure_storage: ^5.1.0 flutter_secure_storage: ^5.1.0
flutter_slidable: ^1.2.0 flutter_slidable: ^2.0.0
flutter_svg: ^0.22.0 flutter_svg: ^0.22.0
flutter_typeahead: ^4.0.0 flutter_typeahead: ^4.0.0
flutter_web_auth: ^0.4.0 flutter_web_auth: ^0.4.0
flutter_webrtc: ^0.8.7 flutter_webrtc: ^0.9.2
future_loading_dialog: ^0.2.3 future_loading_dialog: ^0.2.3
geolocator: ^7.6.2 geolocator: ^7.6.2
handy_window: ^0.1.6 handy_window: ^0.1.6
hive: ^2.2.3
hive_flutter: ^1.1.0 hive_flutter: ^1.1.0
http: ^0.13.4 http: ^0.13.4
image: ^3.1.1 image: ^3.1.1
@ -59,6 +60,7 @@ dependencies:
intl: any intl: any
just_audio: ^0.9.20 just_audio: ^0.9.20
keyboard_shortcuts: ^0.1.4 keyboard_shortcuts: ^0.1.4
latlong2: ^0.8.1
localstorage: ^4.0.0+1 localstorage: ^4.0.0+1
lottie: ^1.2.2 lottie: ^1.2.2
matrix: ^0.11.2 matrix: ^0.11.2
@ -85,14 +87,16 @@ dependencies:
unifiedpush: ^4.0.0 unifiedpush: ^4.0.0
universal_html: ^2.0.8 universal_html: ^2.0.8
url_launcher: ^6.0.20 url_launcher: ^6.0.20
uuid: ^3.0.6
video_compress: ^3.1.1 video_compress: ^3.1.1
video_player: ^2.2.18 video_player: ^2.2.18
vrouter: ^1.2.0+21 vrouter: ^1.2.0+21
wakelock: ^0.6.1+1 wakelock: ^0.6.1+1
webrtc_interface: ^1.0.7
dev_dependencies: dev_dependencies:
dart_code_metrics: ^4.10.1 dart_code_metrics: ^4.10.1
flutter_lints: ^1.0.4 flutter_lints: ^2.0.1
flutter_native_splash: ^2.0.3+1 flutter_native_splash: ^2.0.3+1
flutter_test: flutter_test:
sdk: flutter sdk: flutter

View File

@ -16,8 +16,7 @@ void main() async {
final missing = commands.where((c) => !translated.contains(c)).toList(); final missing = commands.where((c) => !translated.contains(c)).toList();
expect(0, missing.length, expect(0, missing.length,
reason: 'missing hints for ' + reason:
missing.toString() + 'missing hints for $missing\nAdding hints? See scripts/generate_command_hints_glue.sh');
'\nAdding hints? See scripts/generate_command_hints_glue.sh');
}); });
} }

View File

@ -1,3 +1,5 @@
// ignore_for_file: depend_on_referenced_packages
import 'package:matrix/encryption/utils/key_verification.dart'; import 'package:matrix/encryption/utils/key_verification.dart';
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
import 'package:matrix_api_lite/fake_matrix_api.dart'; import 'package:matrix_api_lite/fake_matrix_api.dart';