chore: prefer final and lazy init
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user