我有一个用 Flutter 开发的 Android 应用程序。我的原生 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<MainScreen> {
int _selectedIndex = 2; // Index pentru pagina de statistici
late Widget _currentPage; // Pagina curentă afișată
final List<Widget> _pageStack = []; // Stack pentru istoria paginilor
final List<String> _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<void> _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: <Widget>[
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>[
BottomNavigationBarItem(
icon: Icon(Icons.menu),
label: 'Meniu',
),
BottomNavigationBarItem(
icon: Icon(Icons.person),
label: 'User',
),
BottomNavigationBarItem(
icon: Icon(Icons.logout),
label: 'Logout',
),
],
),
),
);
}
}
我想要手机返回按钮的本机功能
出现此问题的原因是您没有使用 Flutter 的
Navigator
进行导航。相反,您需要手动更新 _currentPage
并管理自定义 _pageStack
。因此,当按下后退按钮时,Flutter 没有任何路由可以弹出,因此它会退出应用程序。
尝试这样的路由:
void _onNavigate(Widget page) {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => page),
);
}