Системная кнопка «Назад» закрывает все приложение во FlutterAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Системная кнопка «Назад» закрывает все приложение во Flutter

Сообщение Anonymous »

Привет всем, у меня возникла проблема с обработкой жеста «Назад» (кнопки «Назад») на 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»