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