chore: prefer final and lazy init

This commit is contained in:
Gordon Hayes
2022-10-07 11:25:49 +02:00
parent b193e5a8c6
commit 5ce982a181
9 changed files with 72 additions and 78 deletions
@@ -164,7 +164,7 @@ class MyChannelPreview extends StatelessWidget {
String stringDate; String stringDate;
final now = DateTime.now(); final now = DateTime.now();
var startOfDay = DateTime(now.year, now.month, now.day); final startOfDay = DateTime(now.year, now.month, now.day);
if (lastMessageAt.millisecondsSinceEpoch >= if (lastMessageAt.millisecondsSinceEpoch >=
startOfDay.millisecondsSinceEpoch) { startOfDay.millisecondsSinceEpoch) {
@@ -300,9 +300,9 @@ class MyChannelPreview extends StatelessWidget {
List<Attachment> attachments, List<Attachment> attachments,
TextStyle normalTextStyle, TextStyle normalTextStyle,
TextStyle mentionsTextStyle) { TextStyle mentionsTextStyle) {
var textList = text.split(' '); final textList = text.split(' ');
var resList = <TextSpan>[]; final resList = <TextSpan>[];
for (var e in textList) { for (final e in textList) {
if (mentions.isNotEmpty && if (mentions.isNotEmpty &&
mentions.any((element) => '@${element.name}' == e)) { mentions.any((element) => '@${element.name}' == e)) {
resList.add(TextSpan( resList.add(TextSpan(
+1 -1
View File
@@ -17,7 +17,7 @@ class ChatBubble extends CustomPainter {
@override @override
void paint(Canvas canvas, Size size) { void paint(Canvas canvas, Size size) {
var path = Path(); final path = Path();
const cornerSize = 18.0; const cornerSize = 18.0;
const buffer = 6.0; const buffer = 6.0;
const innerTailWidth = 7.0; const innerTailWidth = 7.0;
@@ -32,6 +32,15 @@ class _AdvancedOptionsPageState extends State<AdvancedOptionsPage> {
bool loading = false; bool loading = false;
@override
void dispose() {
_apiKeyController.dispose();
_userIdController.dispose();
_userTokenController.dispose();
_usernameController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@@ -102,7 +102,7 @@ class _ChannelMediaDisplayScreenState extends State<ChannelMediaDisplayScreen> {
} }
final media = <_AssetPackage>[]; final media = <_AssetPackage>[];
for (var item in value.asSuccess.items) { for (final item in value.asSuccess.items) {
item.message.attachments item.message.attachments
.where((e) => .where((e) =>
(e.type == 'image' || e.type == 'video') && (e.type == 'image' || e.type == 'video') &&
@@ -110,7 +110,7 @@ class _ChannelMediaDisplayScreenState extends State<ChannelMediaDisplayScreen> {
.forEach((e) { .forEach((e) {
VideoPlayerController? controller; VideoPlayerController? controller;
if (e.type == 'video') { if (e.type == 'video') {
var cachedController = controllerCache[e.assetUrl]; final cachedController = controllerCache[e.assetUrl];
if (cachedController == null) { if (cachedController == null) {
controller = VideoPlayerController.network(e.assetUrl!); controller = VideoPlayerController.network(e.assetUrl!);
@@ -117,7 +117,7 @@ class _ChatInfoScreenState extends State<ChatInfoScreen> {
} }
Widget _buildOptionListTiles() { Widget _buildOptionListTiles() {
var channel = StreamChannel.of(context); final channel = StreamChannel.of(context);
return Column( return Column(
children: [ children: [
@@ -398,7 +398,7 @@ class _SharedGroupsScreen extends StatefulWidget {
class __SharedGroupsScreenState extends State<_SharedGroupsScreen> { class __SharedGroupsScreenState extends State<_SharedGroupsScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var chat = StreamChat.of(context); final chat = StreamChat.of(context);
return Scaffold( return Scaffold(
backgroundColor: StreamChatTheme.of(context).colorTheme.appBg, backgroundColor: StreamChatTheme.of(context).colorTheme.appBg,
@@ -505,7 +505,7 @@ class __SharedGroupsScreenState extends State<_SharedGroupsScreen> {
final maxChars = maxWidth / textStyle.fontSize!; final maxChars = maxWidth / textStyle.fontSize!;
var currentChars = 0; var currentChars = 0;
final currentMembers = <Member>[]; final currentMembers = <Member>[];
for (var element in otherMembers) { for (final element in otherMembers) {
final newLength = currentChars + element.user!.name.length; final newLength = currentChars + element.user!.name.length;
if (newLength < maxChars) { if (newLength < maxChars) {
currentChars = newLength; currentChars = newLength;
@@ -18,16 +18,17 @@ class GroupChatDetailsScreen extends StatefulWidget {
} }
class _GroupChatDetailsScreenState extends State<GroupChatDetailsScreen> { class _GroupChatDetailsScreenState extends State<GroupChatDetailsScreen> {
final _selectedUsers = <User>[]; late final _selectedUsers = <User>[...?widget.selectedUsers];
TextEditingController? _groupNameController; late final TextEditingController _groupNameController =
TextEditingController()..addListener(_groupNameListener);
bool _isGroupNameEmpty = true; bool _isGroupNameEmpty = true;
int get _totalUsers => _selectedUsers.length; int get _totalUsers => _selectedUsers.length;
void _groupNameListener() { void _groupNameListener() {
final name = _groupNameController!.text; final name = _groupNameController.text;
if (mounted) { if (mounted) {
setState(() { setState(() {
_isGroupNameEmpty = name.isEmpty; _isGroupNameEmpty = name.isEmpty;
@@ -35,19 +36,11 @@ class _GroupChatDetailsScreenState extends State<GroupChatDetailsScreen> {
} }
} }
@override
void initState() {
super.initState();
_selectedUsers.addAll(widget.selectedUsers!);
_groupNameController = TextEditingController()
..addListener(_groupNameListener);
}
@override @override
void dispose() { void dispose() {
_groupNameController?.removeListener(_groupNameListener); _groupNameController.removeListener(_groupNameListener);
_groupNameController?.clear(); _groupNameController.clear();
_groupNameController?.dispose(); _groupNameController.dispose();
super.dispose(); super.dispose();
} }
@@ -128,7 +121,7 @@ class _GroupChatDetailsScreenState extends State<GroupChatDetailsScreen> {
? null ? null
: () async { : () async {
try { try {
final groupName = _groupNameController!.text; final groupName = _groupNameController.text;
final client = StreamChat.of(context).client; final client = StreamChat.of(context).client;
final navigator = Navigator.of(context); final navigator = Navigator.of(context);
final channel = client.channel('messaging', final channel = client.channel('messaging',
@@ -25,9 +25,14 @@ class GroupInfoScreen extends StatefulWidget {
} }
class _GroupInfoScreenState extends State<GroupInfoScreen> { class _GroupInfoScreenState extends State<GroupInfoScreen> {
TextEditingController? _nameController; late final TextEditingController _nameController =
TextEditingController.fromValue(
TextEditingValue(text: (channel.extraData['name'] as String?) ?? ''),
);
late final TextEditingController _searchController = TextEditingController()
..addListener(_userNameListener);
TextEditingController? _searchController;
String _userNameQuery = ''; String _userNameQuery = '';
Timer? _debounce; Timer? _debounce;
@@ -37,23 +42,23 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
bool listExpanded = false; bool listExpanded = false;
ValueNotifier<bool?> mutedBool = ValueNotifier(false); late ValueNotifier<bool?> mutedBool = ValueNotifier(channel.isMuted);
late final channel = StreamChannel.of(context).channel; late final channel = StreamChannel.of(context).channel;
late StreamUserListController userListController; late StreamUserListController _userListController;
void _userNameListener() { void _userNameListener() {
if (_searchController!.text == _userNameQuery) { if (_searchController.text == _userNameQuery) {
return; return;
} }
if (_debounce?.isActive ?? false) _debounce!.cancel(); if (_debounce?.isActive ?? false) _debounce!.cancel();
_debounce = Timer(const Duration(milliseconds: 350), () { _debounce = Timer(const Duration(milliseconds: 350), () {
if (mounted) { if (mounted) {
_userNameQuery = _searchController!.text; _userNameQuery = _searchController.text;
userListController.filter = Filter.and( _userListController.filter = Filter.and(
[ [
if (_searchController!.text.isNotEmpty) if (_searchController.text.isNotEmpty)
Filter.autoComplete('name', _userNameQuery), Filter.autoComplete('name', _userNameQuery),
Filter.notIn('id', [ Filter.notIn('id', [
StreamChat.of(context).currentUser!.id, StreamChat.of(context).currentUser!.id,
@@ -63,7 +68,7 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
]), ]),
], ],
); );
userListController.doInitialLoad(); _userListController.doInitialLoad();
} }
}); });
} }
@@ -72,12 +77,7 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
void initState() { void initState() {
super.initState(); super.initState();
_nameController = TextEditingController.fromValue( _nameController.addListener(() {
TextEditingValue(text: (channel.extraData['name'] as String?) ?? ''),
);
_searchController = TextEditingController()..addListener(_userNameListener);
_nameController!.addListener(() {
setState(() {}); setState(() {});
}); });
mutedBool = ValueNotifier(channel.isMuted); mutedBool = ValueNotifier(channel.isMuted);
@@ -85,12 +85,12 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
@override @override
void didChangeDependencies() { void didChangeDependencies() {
userListController = StreamUserListController( _userListController = StreamUserListController(
client: StreamChat.of(context).client, client: StreamChat.of(context).client,
limit: 25, limit: 25,
filter: Filter.and( filter: Filter.and(
[ [
if (_searchController!.text.isNotEmpty) if (_searchController.text.isNotEmpty)
Filter.autoComplete('name', _userNameQuery), Filter.autoComplete('name', _userNameQuery),
Filter.notIn('id', [ Filter.notIn('id', [
StreamChat.of(context).currentUser!.id, StreamChat.of(context).currentUser!.id,
@@ -112,7 +112,9 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
@override @override
void dispose() { void dispose() {
userListController.dispose(); _nameController.dispose();
_searchController.dispose();
_userListController.dispose();
super.dispose(); super.dispose();
} }
@@ -382,7 +384,7 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
} }
Widget _buildNameTile() { Widget _buildNameTile() {
var channelName = (channel.extraData['name'] as String?) ?? ''; final channelName = (channel.extraData['name'] as String?) ?? '';
return Material( return Material(
color: StreamChatTheme.of(context).colorTheme.appBg, color: StreamChatTheme.of(context).colorTheme.appBg,
@@ -429,7 +431,7 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
), ),
), ),
), ),
if (channelName != _nameController!.text.trim()) if (channelName != _nameController.text.trim())
Row( Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
@@ -437,7 +439,7 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
child: StreamSvgIcon.closeSmall(), child: StreamSvgIcon.closeSmall(),
onTap: () { onTap: () {
setState(() { setState(() {
_nameController!.text = _getChannelName( _nameController.text = _getChannelName(
2 * MediaQuery.of(context).size.width / 3, 2 * MediaQuery.of(context).size.width / 3,
members: channel.state!.members, members: channel.state!.members,
extraData: channel.extraData, extraData: channel.extraData,
@@ -458,10 +460,10 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
), ),
onTap: () { onTap: () {
channel.update({ channel.update({
'name': _nameController!.text.trim(), 'name': _nameController.text.trim(),
}).catchError((err) { }).catchError((err) {
setState(() { setState(() {
_nameController!.text = channelName; _nameController.text = channelName;
_focusNode.unfocus(); _focusNode.unfocus();
}); });
}); });
@@ -572,7 +574,7 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
color: StreamChatTheme.of(context).colorTheme.textLowEmphasis, color: StreamChatTheme.of(context).colorTheme.textLowEmphasis,
), ),
onTap: () { onTap: () {
var channel = StreamChannel.of(context).channel; final channel = StreamChannel.of(context).channel;
Navigator.push( Navigator.push(
context, context,
@@ -606,7 +608,7 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
color: StreamChatTheme.of(context).colorTheme.textLowEmphasis, color: StreamChatTheme.of(context).colorTheme.textLowEmphasis,
), ),
onTap: () { onTap: () {
var channel = StreamChannel.of(context).channel; final channel = StreamChannel.of(context).channel;
Navigator.push( Navigator.push(
context, context,
@@ -691,9 +693,9 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
), ),
Expanded( Expanded(
child: StreamUserGridView( child: StreamUserGridView(
controller: userListController, controller: _userListController,
onUserTap: (user) async { onUserTap: (user) async {
_searchController!.clear(); _searchController.clear();
final navigator = Navigator.of(context); final navigator = Navigator.of(context);
await channel.addMembers([user.id]); await channel.addMembers([user.id]);
@@ -740,7 +742,7 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
); );
}, },
).whenComplete(() { ).whenComplete(() {
_searchController?.clear(); _searchController.clear();
}); });
} }
@@ -1053,7 +1055,7 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
double? maxFontSize, double? maxFontSize,
}) { }) {
String? title; String? title;
var client = StreamChat.of(context); final client = StreamChat.of(context);
if (extraData['name'] == null) { if (extraData['name'] == null) {
final otherMembers = final otherMembers =
members!.where((member) => member.user!.id != client.currentUser!.id); members!.where((member) => member.user!.id != client.currentUser!.id);
@@ -1062,7 +1064,7 @@ class _GroupInfoScreenState extends State<GroupInfoScreen> {
final maxChars = maxWidth / maxFontSize!; final maxChars = maxWidth / maxFontSize!;
var currentChars = 0; var currentChars = 0;
final currentMembers = <Member>[]; final currentMembers = <Member>[];
for (var element in otherMembers) { for (final element in otherMembers) {
final newLength = currentChars + element.user!.name.length; final newLength = currentChars + element.user!.name.length;
if (newLength < maxChars) { if (newLength < maxChars) {
currentChars = newLength; currentChars = newLength;
@@ -15,7 +15,8 @@ class NewGroupChatScreen extends StatefulWidget {
} }
class _NewGroupChatScreenState extends State<NewGroupChatScreen> { class _NewGroupChatScreenState extends State<NewGroupChatScreen> {
TextEditingController? _controller; late final TextEditingController _controller = TextEditingController()
..addListener(_userNameListener);
String _userNameQuery = ''; String _userNameQuery = '';
@@ -44,7 +45,7 @@ class _NewGroupChatScreenState extends State<NewGroupChatScreen> {
_debounce = Timer(const Duration(milliseconds: 350), () { _debounce = Timer(const Duration(milliseconds: 350), () {
if (mounted) { if (mounted) {
setState(() { setState(() {
_userNameQuery = _controller!.text; _userNameQuery = _controller.text;
_isSearchActive = _userNameQuery.isNotEmpty; _isSearchActive = _userNameQuery.isNotEmpty;
}); });
userListController.filter = Filter.and([ userListController.filter = Filter.and([
@@ -57,17 +58,11 @@ class _NewGroupChatScreenState extends State<NewGroupChatScreen> {
}); });
} }
@override
void initState() {
super.initState();
_controller = TextEditingController()..addListener(_userNameListener);
}
@override @override
void dispose() { void dispose() {
_controller?.clear(); _controller.clear();
_controller?.removeListener(_userNameListener); _controller.removeListener(_userNameListener);
_controller?.dispose(); _controller.dispose();
userListController.dispose(); userListController.dispose();
super.dispose(); super.dispose();
} }
@@ -36,7 +36,8 @@ class _ChannelList extends State<ChannelList> {
], ],
); );
TextEditingController? _controller; late final TextEditingController _controller = TextEditingController()
..addListener(_channelQueryListener);
bool _isSearchActive = false; bool _isSearchActive = false;
@@ -46,9 +47,9 @@ class _ChannelList extends State<ChannelList> {
if (_debounce?.isActive ?? false) _debounce!.cancel(); if (_debounce?.isActive ?? false) _debounce!.cancel();
_debounce = Timer(const Duration(milliseconds: 350), () { _debounce = Timer(const Duration(milliseconds: 350), () {
if (mounted) { if (mounted) {
_messageSearchListController.searchQuery = _controller!.text; _messageSearchListController.searchQuery = _controller.text;
setState(() { setState(() {
_isSearchActive = _controller!.text.isNotEmpty; _isSearchActive = _controller.text.isNotEmpty;
}); });
if (_isSearchActive) _messageSearchListController.doInitialLoad(); if (_isSearchActive) _messageSearchListController.doInitialLoad();
} }
@@ -65,16 +66,10 @@ class _ChannelList extends State<ChannelList> {
limit: 30, limit: 30,
); );
@override
void initState() {
super.initState();
_controller = TextEditingController()..addListener(_channelQueryListener);
}
@override @override
void dispose() { void dispose() {
_controller?.removeListener(_channelQueryListener); _controller.removeListener(_channelQueryListener);
_controller?.dispose(); _controller.dispose();
_scrollController.dispose(); _scrollController.dispose();
_channelListController.dispose(); _channelListController.dispose();
super.dispose(); super.dispose();
@@ -85,7 +80,7 @@ class _ChannelList extends State<ChannelList> {
return WillPopScope( return WillPopScope(
onWillPop: () async { onWillPop: () async {
if (_isSearchActive) { if (_isSearchActive) {
_controller!.clear(); _controller.clear();
setState(() => _isSearchActive = false); setState(() => _isSearchActive = false);
return false; return false;
} }