feat(stream_chat_v1): implement foreground notifications
This commit is contained in:
@@ -145,6 +145,15 @@ class _ChannelList extends State<ChannelList> {
|
||||
)
|
||||
: ChannelsBloc(
|
||||
child: ChannelListView(
|
||||
onChannelTap: (channel, _) {
|
||||
Navigator.pushNamed(
|
||||
context,
|
||||
Routes.CHANNEL_PAGE,
|
||||
arguments: ChannelPageArgs(
|
||||
channel: channel,
|
||||
),
|
||||
);
|
||||
},
|
||||
onStartChatPressed: () {
|
||||
Navigator.pushNamed(context, Routes.NEW_CHAT);
|
||||
},
|
||||
@@ -154,7 +163,6 @@ class _ChannelList extends State<ChannelList> {
|
||||
pagination: PaginationParams(
|
||||
limit: 20,
|
||||
),
|
||||
channelWidget: ChannelPage(),
|
||||
onViewInfoTap: (channel) {
|
||||
Navigator.pop(context);
|
||||
if (channel.memberCount == 2 && channel.isDistinct) {
|
||||
|
||||
@@ -1,9 +1,56 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:example/channel_page.dart';
|
||||
import 'package:example/notifications_service.dart';
|
||||
import 'package:example/routes/app_routes.dart';
|
||||
import 'package:example/routes/routes.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
||||
|
||||
class MyObserver extends NavigatorObserver {
|
||||
Route? currentRoute;
|
||||
late final StreamSubscription _subscription;
|
||||
|
||||
MyObserver(StreamChatClient client, BuildContext context) {
|
||||
_subscription = client.on(EventType.messageNew).listen((event) {
|
||||
final channelId = event.channelId;
|
||||
if (currentRoute?.settings.name == Routes.CHANNEL_PAGE) {
|
||||
final args = currentRoute?.settings.arguments as ChannelPageArgs;
|
||||
if (args.channel?.id == channelId) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
showLocalNotification(event, client.state.currentUser!.id, context);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void didPop(Route route, Route? previousRoute) {
|
||||
currentRoute = route;
|
||||
}
|
||||
|
||||
@override
|
||||
void didPush(Route route, Route? previousRoute) {
|
||||
currentRoute = route;
|
||||
}
|
||||
|
||||
@override
|
||||
void didRemove(Route route, Route? previousRoute) {
|
||||
currentRoute = route;
|
||||
}
|
||||
|
||||
@override
|
||||
void didReplace({Route? newRoute, Route? oldRoute}) {
|
||||
currentRoute = newRoute;
|
||||
}
|
||||
|
||||
void dispose() {
|
||||
_subscription.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
class HomePageArgs {
|
||||
final StreamChatClient chatClient;
|
||||
|
||||
@@ -24,6 +71,7 @@ class HomePage extends StatefulWidget {
|
||||
|
||||
class _HomePageState extends State<HomePage> {
|
||||
final GlobalKey<NavigatorState> _navigatorKey = GlobalKey();
|
||||
MyObserver? _observer;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -38,8 +86,16 @@ class _HomePageState extends State<HomePage> {
|
||||
key: _navigatorKey,
|
||||
onGenerateRoute: AppRoutes.generateRoute,
|
||||
initialRoute: Routes.CHANNEL_LIST_PAGE,
|
||||
observers: [_observer!],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
_observer?.dispose();
|
||||
_observer = MyObserver(widget.chatClient, context);
|
||||
super.didChangeDependencies();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,13 +21,13 @@ class AppRoutes {
|
||||
switch (settings.name) {
|
||||
case Routes.APP:
|
||||
return MaterialPageRoute(
|
||||
settings: const RouteSettings(name: Routes.APP),
|
||||
settings: RouteSettings(arguments: args, name: Routes.APP),
|
||||
builder: (_) {
|
||||
return MyApp();
|
||||
});
|
||||
case Routes.HOME:
|
||||
return MaterialPageRoute(
|
||||
settings: const RouteSettings(name: Routes.HOME),
|
||||
settings: RouteSettings(arguments: args, name: Routes.HOME),
|
||||
builder: (_) {
|
||||
final homePageArgs = args as HomePageArgs;
|
||||
return HomePage(
|
||||
@@ -36,18 +36,19 @@ class AppRoutes {
|
||||
});
|
||||
case Routes.CHOOSE_USER:
|
||||
return MaterialPageRoute(
|
||||
settings: const RouteSettings(name: Routes.CHOOSE_USER),
|
||||
settings: RouteSettings(arguments: args, name: Routes.CHOOSE_USER),
|
||||
builder: (_) {
|
||||
return ChooseUserPage();
|
||||
});
|
||||
case Routes.ADVANCED_OPTIONS:
|
||||
return MaterialPageRoute(
|
||||
settings: const RouteSettings(name: Routes.ADVANCED_OPTIONS),
|
||||
settings:
|
||||
RouteSettings(arguments: args, name: Routes.ADVANCED_OPTIONS),
|
||||
builder: (_) => AdvancedOptionsPage(),
|
||||
);
|
||||
case Routes.CHANNEL_PAGE:
|
||||
return MaterialPageRoute(
|
||||
settings: const RouteSettings(name: Routes.CHANNEL_PAGE),
|
||||
settings: RouteSettings(arguments: args, name: Routes.CHANNEL_PAGE),
|
||||
builder: (_) {
|
||||
final channelPageArgs = args as ChannelPageArgs;
|
||||
return StreamChannel(
|
||||
@@ -61,19 +62,21 @@ class AppRoutes {
|
||||
});
|
||||
case Routes.NEW_CHAT:
|
||||
return MaterialPageRoute(
|
||||
settings: const RouteSettings(name: Routes.NEW_CHAT),
|
||||
settings: RouteSettings(arguments: args, name: Routes.NEW_CHAT),
|
||||
builder: (_) {
|
||||
return NewChatScreen();
|
||||
});
|
||||
case Routes.NEW_GROUP_CHAT:
|
||||
return MaterialPageRoute(
|
||||
settings: const RouteSettings(name: Routes.NEW_GROUP_CHAT),
|
||||
settings:
|
||||
RouteSettings(arguments: args, name: Routes.NEW_GROUP_CHAT),
|
||||
builder: (_) {
|
||||
return NewGroupChatScreen();
|
||||
});
|
||||
case Routes.NEW_GROUP_CHAT_DETAILS:
|
||||
return MaterialPageRoute(
|
||||
settings: const RouteSettings(name: Routes.NEW_GROUP_CHAT_DETAILS),
|
||||
settings: RouteSettings(
|
||||
arguments: args, name: Routes.NEW_GROUP_CHAT_DETAILS),
|
||||
builder: (_) {
|
||||
return GroupChatDetailsScreen(
|
||||
selectedUsers: args as List<User>?,
|
||||
@@ -81,7 +84,8 @@ class AppRoutes {
|
||||
});
|
||||
case Routes.CHAT_INFO_SCREEN:
|
||||
return MaterialPageRoute(
|
||||
settings: const RouteSettings(name: Routes.CHAT_INFO_SCREEN),
|
||||
settings:
|
||||
RouteSettings(arguments: args, name: Routes.CHAT_INFO_SCREEN),
|
||||
builder: (context) {
|
||||
return ChatInfoScreen(
|
||||
user: args as User?,
|
||||
@@ -90,7 +94,8 @@ class AppRoutes {
|
||||
});
|
||||
case Routes.GROUP_INFO_SCREEN:
|
||||
return MaterialPageRoute(
|
||||
settings: const RouteSettings(name: Routes.GROUP_INFO_SCREEN),
|
||||
settings:
|
||||
RouteSettings(arguments: args, name: Routes.GROUP_INFO_SCREEN),
|
||||
builder: (context) {
|
||||
return GroupInfoScreen(
|
||||
messageTheme: StreamChatTheme.of(context).ownMessageTheme,
|
||||
@@ -98,7 +103,8 @@ class AppRoutes {
|
||||
});
|
||||
case Routes.CHANNEL_LIST_PAGE:
|
||||
return MaterialPageRoute(
|
||||
settings: const RouteSettings(name: Routes.CHANNEL_LIST_PAGE),
|
||||
settings:
|
||||
RouteSettings(arguments: args, name: Routes.CHANNEL_LIST_PAGE),
|
||||
builder: (context) {
|
||||
return ChannelListPage();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user