Пользователь может нажать на push-уведомление и открыть целевую страницу следующим образом:
if (data["myPage"] == 'Page1' || data["myPage"] == 'Page2') {
navigatorKey.currentState?.push(MaterialPageRoute(
builder: (context) => targetPage(
page: data['myPage'],
key1: data['value1'],
key2: data['value2'],
),
));
}
Как я могу повторно открыть/перезагрузить ту же страницу, если пользователь нажимает на другое уведомление, которое ведет к targetPage
?
С помощью приведенного выше кода я просто открываю второй экземпляр той же страницы.
Спасибо!
@Nguyenfamily Это действительно правильно. Вы можете увидеть мой ответ ниже. Вы можете использовать routeInformationParser.configuration
.
Вы можете использовать пакет go_router.
В частности, вы можете проверить, есть ли в routeInformationParser.configuration желаемый маршрут в стеке. А если уже есть, то go
на этот маршрут. В противном случае push
новый маршрут помещается в стек.
Создайте функцию:
bool doesRouteExists(String route) {
try {
return goRouter.routeInformationParser.configuration
.findMatch(route)
.matches
.isNotEmpty;
} catch (err) {
return false;
}
}
и используйте его:
void handleNavigation(String data) {
if (doesRouteExists('/target')) {
print('Route exists');
goRouter.goNamed('target', extra: data);
} else {
print('Route does not exist');
goRouter.pushNamed('target', extra: data);
}
}
Полный работоспособный пример:
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
void main() => runApp(MyApp());
final GoRouter goRouter = GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) => HomePage(),
),
GoRoute(
path: '/target',
name: 'target',
builder: (context, state) => MyTargetPage(data: state.extra as String?),
),
],
);
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) => MaterialApp.router(
routerConfig: goRouter,
);
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(title: Text('Home')),
body: Center(
child: ElevatedButton(
child: Text('Open Target Page'),
onPressed: () => handleNavigation('Data 1'),
),
),
);
}
class MyTargetPage extends StatelessWidget {
final String? data;
MyTargetPage({this.data});
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(title: Text('Target Page')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Data: $data'),
ElevatedButton(
child: Text('Update Data'),
onPressed: () => handleNavigation('Updated Data'),
),
],
),
),
);
}
void handleNavigation(String data) {
if (doesRouteExists('/target')) {
print('Route exists');
goRouter.goNamed('target', extra: data);
} else {
print('Route does not exist');
goRouter.pushNamed('target', extra: data);
}
}
bool doesRouteExists(String route) {
try {
return goRouter.routeInformationParser.configuration
.findMatch(route)
.matches
.isNotEmpty;
} catch (err) {
return false;
}
}
См. также
интересный. В своем приложении я использую
go_router
иcontext.go()
вместоcontext.push()
. Он выскочит на весь экран и пойдет точно по маршруту назначения, не заботясь о перезагрузке.