Merge branch 'develop'
This commit is contained in:
@@ -145,6 +145,15 @@ class _ChannelList extends State<ChannelList> {
|
|||||||
)
|
)
|
||||||
: ChannelsBloc(
|
: ChannelsBloc(
|
||||||
child: ChannelListView(
|
child: ChannelListView(
|
||||||
|
onChannelTap: (channel, _) {
|
||||||
|
Navigator.pushNamed(
|
||||||
|
context,
|
||||||
|
Routes.CHANNEL_PAGE,
|
||||||
|
arguments: ChannelPageArgs(
|
||||||
|
channel: channel,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
onStartChatPressed: () {
|
onStartChatPressed: () {
|
||||||
Navigator.pushNamed(context, Routes.NEW_CHAT);
|
Navigator.pushNamed(context, Routes.NEW_CHAT);
|
||||||
},
|
},
|
||||||
@@ -154,7 +163,6 @@ class _ChannelList extends State<ChannelList> {
|
|||||||
pagination: PaginationParams(
|
pagination: PaginationParams(
|
||||||
limit: 20,
|
limit: 20,
|
||||||
),
|
),
|
||||||
channelWidget: ChannelPage(),
|
|
||||||
onViewInfoTap: (channel) {
|
onViewInfoTap: (channel) {
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
if (channel.memberCount == 2 && channel.isDistinct) {
|
if (channel.memberCount == 2 && channel.isDistinct) {
|
||||||
|
|||||||
@@ -1,9 +1,71 @@
|
|||||||
|
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/app_routes.dart';
|
||||||
import 'package:example/routes/routes.dart';
|
import 'package:example/routes/routes.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
||||||
|
|
||||||
|
class MyObserver extends NavigatorObserver {
|
||||||
|
Route? currentRoute;
|
||||||
|
late final StreamSubscription _subscription;
|
||||||
|
|
||||||
|
MyObserver(
|
||||||
|
StreamChatClient client,
|
||||||
|
GlobalKey<NavigatorState> navigatorKey,
|
||||||
|
) {
|
||||||
|
_subscription = client
|
||||||
|
.on(
|
||||||
|
EventType.messageNew,
|
||||||
|
EventType.notificationMessageNew,
|
||||||
|
)
|
||||||
|
.listen((event) {
|
||||||
|
if (event.message?.user?.id == client.state.currentUser?.id) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
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,
|
||||||
|
navigatorKey.currentState!.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 {
|
class HomePageArgs {
|
||||||
final StreamChatClient chatClient;
|
final StreamChatClient chatClient;
|
||||||
|
|
||||||
@@ -24,6 +86,7 @@ class HomePage extends StatefulWidget {
|
|||||||
|
|
||||||
class _HomePageState extends State<HomePage> {
|
class _HomePageState extends State<HomePage> {
|
||||||
final GlobalKey<NavigatorState> _navigatorKey = GlobalKey();
|
final GlobalKey<NavigatorState> _navigatorKey = GlobalKey();
|
||||||
|
MyObserver? _observer;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@@ -38,8 +101,16 @@ class _HomePageState extends State<HomePage> {
|
|||||||
key: _navigatorKey,
|
key: _navigatorKey,
|
||||||
onGenerateRoute: AppRoutes.generateRoute,
|
onGenerateRoute: AppRoutes.generateRoute,
|
||||||
initialRoute: Routes.CHANNEL_LIST_PAGE,
|
initialRoute: Routes.CHANNEL_LIST_PAGE,
|
||||||
|
observers: [_observer!],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didChangeDependencies() {
|
||||||
|
_observer?.dispose();
|
||||||
|
_observer = MyObserver(widget.chatClient, _navigatorKey);
|
||||||
|
super.didChangeDependencies();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,16 @@
|
|||||||
|
import 'package:example/channel_page.dart';
|
||||||
import 'package:example/localizations.dart';
|
import 'package:example/localizations.dart';
|
||||||
|
import 'package:example/routes/routes.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart'
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart'
|
||||||
hide Message;
|
hide Message;
|
||||||
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
||||||
|
|
||||||
void showLocalNotification(
|
void showLocalNotification(
|
||||||
Event event, String currentUserId, BuildContext context) async {
|
Event event,
|
||||||
|
String currentUserId,
|
||||||
|
BuildContext context,
|
||||||
|
) async {
|
||||||
if (![
|
if (![
|
||||||
EventType.messageNew,
|
EventType.messageNew,
|
||||||
EventType.notificationMessageNew,
|
EventType.notificationMessageNew,
|
||||||
@@ -22,7 +27,34 @@ void showLocalNotification(
|
|||||||
android: initializationSettingsAndroid,
|
android: initializationSettingsAndroid,
|
||||||
iOS: initializationSettingsIOS,
|
iOS: initializationSettingsIOS,
|
||||||
);
|
);
|
||||||
await flutterLocalNotificationsPlugin.initialize(initializationSettings);
|
await flutterLocalNotificationsPlugin.initialize(
|
||||||
|
initializationSettings,
|
||||||
|
onSelectNotification: (channelCid) async {
|
||||||
|
if (channelCid != null) {
|
||||||
|
final client = StreamChat.of(context).client;
|
||||||
|
var channel = client.state.channels[channelCid];
|
||||||
|
|
||||||
|
if (channel == null) {
|
||||||
|
final splits = channelCid.split(':');
|
||||||
|
final type = splits[0];
|
||||||
|
final id = splits[1];
|
||||||
|
channel = client.channel(
|
||||||
|
type,
|
||||||
|
id: id,
|
||||||
|
);
|
||||||
|
await channel.watch();
|
||||||
|
}
|
||||||
|
|
||||||
|
Navigator.pushNamed(
|
||||||
|
context,
|
||||||
|
Routes.CHANNEL_PAGE,
|
||||||
|
arguments: ChannelPageArgs(
|
||||||
|
channel: channel,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
await flutterLocalNotificationsPlugin.show(
|
await flutterLocalNotificationsPlugin.show(
|
||||||
event.message!.id.hashCode,
|
event.message!.id.hashCode,
|
||||||
event.message!.user!.name,
|
event.message!.user!.name,
|
||||||
@@ -37,5 +69,6 @@ void showLocalNotification(
|
|||||||
),
|
),
|
||||||
iOS: IOSNotificationDetails(),
|
iOS: IOSNotificationDetails(),
|
||||||
),
|
),
|
||||||
|
payload: '${event.channelType}:${event.channelId}',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,13 +21,13 @@ class AppRoutes {
|
|||||||
switch (settings.name) {
|
switch (settings.name) {
|
||||||
case Routes.APP:
|
case Routes.APP:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
settings: const RouteSettings(name: Routes.APP),
|
settings: RouteSettings(arguments: args, name: Routes.APP),
|
||||||
builder: (_) {
|
builder: (_) {
|
||||||
return MyApp();
|
return MyApp();
|
||||||
});
|
});
|
||||||
case Routes.HOME:
|
case Routes.HOME:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
settings: const RouteSettings(name: Routes.HOME),
|
settings: RouteSettings(arguments: args, name: Routes.HOME),
|
||||||
builder: (_) {
|
builder: (_) {
|
||||||
final homePageArgs = args as HomePageArgs;
|
final homePageArgs = args as HomePageArgs;
|
||||||
return HomePage(
|
return HomePage(
|
||||||
@@ -36,18 +36,19 @@ class AppRoutes {
|
|||||||
});
|
});
|
||||||
case Routes.CHOOSE_USER:
|
case Routes.CHOOSE_USER:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
settings: const RouteSettings(name: Routes.CHOOSE_USER),
|
settings: RouteSettings(arguments: args, name: Routes.CHOOSE_USER),
|
||||||
builder: (_) {
|
builder: (_) {
|
||||||
return ChooseUserPage();
|
return ChooseUserPage();
|
||||||
});
|
});
|
||||||
case Routes.ADVANCED_OPTIONS:
|
case Routes.ADVANCED_OPTIONS:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
settings: const RouteSettings(name: Routes.ADVANCED_OPTIONS),
|
settings:
|
||||||
|
RouteSettings(arguments: args, name: Routes.ADVANCED_OPTIONS),
|
||||||
builder: (_) => AdvancedOptionsPage(),
|
builder: (_) => AdvancedOptionsPage(),
|
||||||
);
|
);
|
||||||
case Routes.CHANNEL_PAGE:
|
case Routes.CHANNEL_PAGE:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
settings: const RouteSettings(name: Routes.CHANNEL_PAGE),
|
settings: RouteSettings(arguments: args, name: Routes.CHANNEL_PAGE),
|
||||||
builder: (_) {
|
builder: (_) {
|
||||||
final channelPageArgs = args as ChannelPageArgs;
|
final channelPageArgs = args as ChannelPageArgs;
|
||||||
return StreamChannel(
|
return StreamChannel(
|
||||||
@@ -61,19 +62,21 @@ class AppRoutes {
|
|||||||
});
|
});
|
||||||
case Routes.NEW_CHAT:
|
case Routes.NEW_CHAT:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
settings: const RouteSettings(name: Routes.NEW_CHAT),
|
settings: RouteSettings(arguments: args, name: Routes.NEW_CHAT),
|
||||||
builder: (_) {
|
builder: (_) {
|
||||||
return NewChatScreen();
|
return NewChatScreen();
|
||||||
});
|
});
|
||||||
case Routes.NEW_GROUP_CHAT:
|
case Routes.NEW_GROUP_CHAT:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
settings: const RouteSettings(name: Routes.NEW_GROUP_CHAT),
|
settings:
|
||||||
|
RouteSettings(arguments: args, name: Routes.NEW_GROUP_CHAT),
|
||||||
builder: (_) {
|
builder: (_) {
|
||||||
return NewGroupChatScreen();
|
return NewGroupChatScreen();
|
||||||
});
|
});
|
||||||
case Routes.NEW_GROUP_CHAT_DETAILS:
|
case Routes.NEW_GROUP_CHAT_DETAILS:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
settings: const RouteSettings(name: Routes.NEW_GROUP_CHAT_DETAILS),
|
settings: RouteSettings(
|
||||||
|
arguments: args, name: Routes.NEW_GROUP_CHAT_DETAILS),
|
||||||
builder: (_) {
|
builder: (_) {
|
||||||
return GroupChatDetailsScreen(
|
return GroupChatDetailsScreen(
|
||||||
selectedUsers: args as List<User>?,
|
selectedUsers: args as List<User>?,
|
||||||
@@ -81,7 +84,8 @@ class AppRoutes {
|
|||||||
});
|
});
|
||||||
case Routes.CHAT_INFO_SCREEN:
|
case Routes.CHAT_INFO_SCREEN:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
settings: const RouteSettings(name: Routes.CHAT_INFO_SCREEN),
|
settings:
|
||||||
|
RouteSettings(arguments: args, name: Routes.CHAT_INFO_SCREEN),
|
||||||
builder: (context) {
|
builder: (context) {
|
||||||
return ChatInfoScreen(
|
return ChatInfoScreen(
|
||||||
user: args as User?,
|
user: args as User?,
|
||||||
@@ -90,7 +94,8 @@ class AppRoutes {
|
|||||||
});
|
});
|
||||||
case Routes.GROUP_INFO_SCREEN:
|
case Routes.GROUP_INFO_SCREEN:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
settings: const RouteSettings(name: Routes.GROUP_INFO_SCREEN),
|
settings:
|
||||||
|
RouteSettings(arguments: args, name: Routes.GROUP_INFO_SCREEN),
|
||||||
builder: (context) {
|
builder: (context) {
|
||||||
return GroupInfoScreen(
|
return GroupInfoScreen(
|
||||||
messageTheme: StreamChatTheme.of(context).ownMessageTheme,
|
messageTheme: StreamChatTheme.of(context).ownMessageTheme,
|
||||||
@@ -98,7 +103,8 @@ class AppRoutes {
|
|||||||
});
|
});
|
||||||
case Routes.CHANNEL_LIST_PAGE:
|
case Routes.CHANNEL_LIST_PAGE:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
settings: const RouteSettings(name: Routes.CHANNEL_LIST_PAGE),
|
settings:
|
||||||
|
RouteSettings(arguments: args, name: Routes.CHANNEL_LIST_PAGE),
|
||||||
builder: (context) {
|
builder: (context) {
|
||||||
return ChannelListPage();
|
return ChannelListPage();
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user