Merge pull request #88 from GetStream/chore/cleanup
chore: prefer final and lazy init
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user