Родная кнопка «Назад» Android не работает должным образомAndroid

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

Сообщение Anonymous »

У меня есть приложение для Android, разработанное во Flutter. У меня родная кнопка НАЗАД на Android (телефоне) работает некорректно. независимо от того, сколько страниц я посещаю, когда я нажимаю НАЗАД, я не возвращаюсь на предыдущую посещенную страницу, а выхожу из моего приложения. я не знаю, где изменилось нативное поведение. я попробовал WillPopScope (даже если он устарел), PopScope (но без диалогового окна подтверждения). Я также попытался создать список посещенных страниц, чтобы нажатие кнопки «Назад» возвращало меня на предыдущую посещенную страницу из этого списка. Ничего не сработало. Кнопка НАЗАД на телефоне выбрасывает меня из приложения

Код: Выделить всё

import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'login_screen.dart';
import 'menu_page.dart';
import 'user_page.dart';
import 'statistici_page.dart';

class MainScreen extends StatefulWidget {
final String phoneId;
final String idHash;

const MainScreen({super.key, required this.phoneId, required this.idHash});

@override
MainScreenState createState() => MainScreenState();
}

class MainScreenState extends State {
int _selectedIndex = 2; // Index pentru pagina de statistici
late Widget _currentPage; // Pagina curentă afișată
final List _pageStack = []; // Stack pentru istoria paginilor
final List _visitedPages = []; // Array pentru paginile vizitate

// Variabilă pentru a controla navigarea
bool canPopBoolVar = true;

@override
void initState() {
super.initState();
_currentPage = const StatisticiPage(); // Setați pagina implicită la statistici
_pageStack.add(_currentPage); // Adăugați pagina inițială în stack
_visitedPages.add('StatisticiPage'); // Adăugați în array-ul de pagini vizitate
}

void _onBottomNavTap(int index) {
if (index == 2) {
_logout(); // Apelare logout
return; // Oprește funcția după logout
}

setState(() {
_selectedIndex = index;

switch (index) {
case 0:
_currentPage = MenuPage(onNavigate: _onNavigate); // Navigare la MenuPage
_visitedPages.add('MenuPage'); // Adaugă la paginile vizitate
break;
case 1:
_currentPage = UserPage(onNavigate: _onNavigate); // Navigare la UserPage
_visitedPages.add('UserPage'); // Adaugă la paginile vizitate
break;
case 2:
_currentPage = const StatisticiPage(); // Pagina implicită
_visitedPages.add('StatisticiPage'); // Adaugă la paginile vizitate
break;
default:
_currentPage = const StatisticiPage(); // Pagina fallback
_visitedPages.add('StatisticiPage'); // Adaugă la paginile vizitate
}

_pageStack.add(_currentPage); // Adaugă pagina curentă în stack
});
}

// Navigare la alte pagini din aplicație
void _onNavigate(Widget page, String title) {
setState(() {
_currentPage = page; // Setează pagina curentă
_pageStack.add(page); // Adaugă pagina în stack
_visitedPages.add(title); // Adaugă titlul în array-ul de pagini vizitate
});
}

// Logout funcționalitate
Future _logout() async {
bool confirmLogout = await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text('Confirmare Ieșire'),
content: const Text('Sigur doriți să vă delogați?'),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(false),
child: const Text('Anulează'),
),
ElevatedButton(
onPressed: () => Navigator.of(context).pop(true),
child: const Text('Delogare'),
),
],
);
},
);

if (confirmLogout == true) {
const FlutterSecureStorage storage = FlutterSecureStorage();
final allKeys = await storage.readAll();
final preserveSet = {'key1', 'key2'}; // Cheile pe care vrei să le păstrezi
final keysToDelete = allKeys.keys.where((key) => !preserveSet.contains(key)).toList();

for (var key in keysToDelete) {
await storage.delete(key: key);
}

if (!mounted) return;

Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (context) => LoginScreen(phoneId: widget.phoneId),
),
);
}
}

@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
if (Navigator.of(context).canPop()) {
Navigator.of(context).pop();
return false; // Previne închiderea aplicației
}
return true;  // Permite închiderea aplicației
},
child: Scaffold(
appBar: AppBar(
title: Text('App Title'), // Titlu aplicație
leading: Builder(
builder: (BuildContext context) {
return IconButton(
icon: const Icon(Icons.arrow_back),
color: Colors.black,
onPressed: () {
Navigator.pop(context);
},
);
},
),
),
body: _currentPage, // Afișează pagina curentă
bottomNavigationBar: BottomNavigationBar(
currentIndex: _selectedIndex,
onTap: _onBottomNavTap,
items: const [
BottomNavigationBarItem(
icon: Icon(Icons.menu),
label: 'Meniu',
),
BottomNavigationBarItem(
icon: Icon(Icons.person),
label: 'User',
),
BottomNavigationBarItem(
icon: Icon(Icons.logout),
label: 'Logout',
),
],
),
),
);
}
}

Мне нужна встроенная функция кнопки НАЗАД на телефоне

Подробнее здесь: https://stackoverflow.com/questions/790 ... g-properly
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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