Android 原生后退按钮无法正常使用

问题描述 投票:0回答:1

我有一个用 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',
            ),
          ],
        ),
      ),
    );
  }
}

我想要手机返回按钮的本机功能

android flutter back
1个回答
0
投票

出现此问题的原因是您没有使用 Flutter 的

Navigator
进行导航。相反,您需要手动更新
_currentPage
并管理自定义
_pageStack
。因此,当按下后退按钮时,Flutter 没有任何路由可以弹出,因此它会退出应用程序。

尝试这样的路由:

void _onNavigate(Widget page) {
  Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => page),
  );
}
© www.soinside.com 2019 - 2024. All rights reserved.