Привет всем, у меня возникла проблема с обработкой жеста «Назад» (кнопки «Назад») на Android в моем приложении Flutter. Например, у меня есть экран, перемещаемый с помощью функции pushNamed Navigator (экран входа в систему перемещается из экрана приветствия). На этом экране я хочу, чтобы приложение вернулось к предыдущему экрану, но вместо этого приложение закрывается. Вот код.
Класс маршрутизатора
class AppRouter {
Route? onGenerateRoute(RouteSettings routeSettings) {
switch (routeSettings.name) {
case '/login':
return PageRouteBuilder(
settings: routeSettings,
pageBuilder: (_, __, ___) {
return const LoginScreen();
},
// Pass this to make popUntil(), pushNamedAndRemoveUntil(), works
transitionDuration: const Duration(milliseconds: 600),
reverseTransitionDuration: const Duration(milliseconds: 450),
transitionsBuilder: (_, a, __, c) => SlideTransition(
position: Tween(
begin: const Offset(1.0, 0.0), // From bottom
end: Offset.zero,
).animate(
CurvedAnimation(
parent: a,
curve: Curves.easeInOutCubicEmphasized,
),
),
child: c));
default:
return _materialRoute(const WelcomeScreen());
}
}
static Route _materialRoute(Widget view) {
return MaterialPageRoute(builder: (_) => view);
}
}
main.dart
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State createState() => _MyAppState();
}
class _MyAppState extends State {
@override
void initState() {
super.initState();
}
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIMode(
SystemUiMode.edgeToEdge,
);
return ScreenUtilInit(
designSize: const Size(430, 932),
minTextAdapt: true,
splitScreenMode: true,
builder: (_, child) {
return MaterialApp(
home: Navigator(
key: navigatorKey,
onGenerateRoute: AppRouter().onGenerateRoute,
),
);
});
}
}
Экран приветствия
class WelcomeScreen extends StatefulWidget {
const WelcomeScreen({super.key});
@override
State createState() {
return _WelcomeScreenState();
}
}
class _WelcomeScreenState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: () {
Navigator.of(context).pushNamed('/login');
},
child: const Text('Continue with E-Mail'),
),
),
const SizedBox(
height: 12,
),
],
),
),
),
);
}
}
Экран входа
class LoginScreen extends StatefulWidget {
const LoginScreen({super.key});
@override
State createState() {
return _LoginScreenState();
}
}
class _LoginScreenState extends State {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return PopScope(
canPop: true,
onPopInvoked: (didPop) => print('onPopInvoked didPop? $didPop'),
child: Scaffold(
appBar: AppBar(
toolbarHeight: 0.09.sh,
leadingWidth: 70,
leading: Padding(
padding: const EdgeInsets.only(left: 20),
child: GestureDetector(
onTap: () {
Navigator.of(context).pushReplacementNamed('/welcome');
},
child: SvgPicture.asset(
'assets/icons/back-in-circle.svg',
fit: BoxFit.contain,
color: Theme.of(context).brightness == Brightness.light
? colorBlack
: null,
),
),
)),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.max,
children: [
Text("Login screen")
],
),
),
),
),
);
}
}
Следующую строку уже добавили в AndroidManifest.xml
...
Подробнее здесь: https://stackoverflow.com/questions/784 ... in-flutter
Системная кнопка «Назад» закрывает все приложение во Flutter ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1715533784
Anonymous
Привет всем, у меня возникла проблема с обработкой жеста «Назад» (кнопки «Назад») на Android в моем приложении Flutter. Например, у меня есть экран, перемещаемый с помощью функции pushNamed Navigator (экран входа в систему перемещается из экрана приветствия). На этом экране я хочу, чтобы приложение вернулось к предыдущему экрану, но вместо этого приложение закрывается. Вот код.
[b]Класс маршрутизатора[/b]
class AppRouter {
Route? onGenerateRoute(RouteSettings routeSettings) {
switch (routeSettings.name) {
case '/login':
return PageRouteBuilder(
settings: routeSettings,
pageBuilder: (_, __, ___) {
return const LoginScreen();
},
// Pass this to make popUntil(), pushNamedAndRemoveUntil(), works
transitionDuration: const Duration(milliseconds: 600),
reverseTransitionDuration: const Duration(milliseconds: 450),
transitionsBuilder: (_, a, __, c) => SlideTransition(
position: Tween(
begin: const Offset(1.0, 0.0), // From bottom
end: Offset.zero,
).animate(
CurvedAnimation(
parent: a,
curve: Curves.easeInOutCubicEmphasized,
),
),
child: c));
default:
return _materialRoute(const WelcomeScreen());
}
}
static Route _materialRoute(Widget view) {
return MaterialPageRoute(builder: (_) => view);
}
}
[b]main.dart[/b]
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State createState() => _MyAppState();
}
class _MyAppState extends State {
@override
void initState() {
super.initState();
}
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIMode(
SystemUiMode.edgeToEdge,
);
return ScreenUtilInit(
designSize: const Size(430, 932),
minTextAdapt: true,
splitScreenMode: true,
builder: (_, child) {
return MaterialApp(
home: Navigator(
key: navigatorKey,
onGenerateRoute: AppRouter().onGenerateRoute,
),
);
});
}
}
[b]Экран приветствия[/b]
class WelcomeScreen extends StatefulWidget {
const WelcomeScreen({super.key});
@override
State createState() {
return _WelcomeScreenState();
}
}
class _WelcomeScreenState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: () {
Navigator.of(context).pushNamed('/login');
},
child: const Text('Continue with E-Mail'),
),
),
const SizedBox(
height: 12,
),
],
),
),
),
);
}
}
[b]Экран входа[/b]
class LoginScreen extends StatefulWidget {
const LoginScreen({super.key});
@override
State createState() {
return _LoginScreenState();
}
}
class _LoginScreenState extends State {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return PopScope(
canPop: true,
onPopInvoked: (didPop) => print('onPopInvoked didPop? $didPop'),
child: Scaffold(
appBar: AppBar(
toolbarHeight: 0.09.sh,
leadingWidth: 70,
leading: Padding(
padding: const EdgeInsets.only(left: 20),
child: GestureDetector(
onTap: () {
Navigator.of(context).pushReplacementNamed('/welcome');
},
child: SvgPicture.asset(
'assets/icons/back-in-circle.svg',
fit: BoxFit.contain,
color: Theme.of(context).brightness == Brightness.light
? colorBlack
: null,
),
),
)),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.max,
children: [
Text("Login screen")
],
),
),
),
),
);
}
}
Следующую строку уже добавили в AndroidManifest.xml
...
Подробнее здесь: [url]https://stackoverflow.com/questions/78468682/system-go-back-button-closes-whole-application-in-flutter[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия