Flutter 应用程序退出时不调用任何回拨,按设备返回,颤振

Flutter 应用程序退出时不调用任何回拨,按设备返回,颤振,flutter,Flutter,应用程序入口点: void main() { runWhat();} void runWhat() async{ //getLoggedInSharedPrefs() gets logged in state from SharedPrefs await getLoggedInSharedPrefs().then((isLoggedIn) { if(isLoggedIn) { runApp(Home()); // User is Logged in go to H

应用程序入口点:

void main() {
  runWhat();}

void runWhat() async{

//getLoggedInSharedPrefs() gets logged in state from SharedPrefs
  await getLoggedInSharedPrefs().then((isLoggedIn) {
    if(isLoggedIn) {
      runApp(Home()); // User is Logged in go to Home; 
    } else {
      runApp(new MyApp()); // Login Screen - separate from Home
    }
  });
}
在家里,我想提醒用户按下后退键,并提醒他们是否想退出应用程序。但无论是谁都不会打电话

Home是MyApp的独立屏幕,不是MyApp的主体

class Home extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    HomeState homeState() => new HomeState();
    return homeState();
  }
}

class HomeState extends State<Home> {

    @override
    Widget build(BuildContext context) {
      return WillPopScope(
        onWillPop: _onWillPop,
         child: new MaterialApp(.....

    @override
      void dispose() {
        print('dispose: $this');
        super.dispose();
      }

     Future<bool> _onWillPop() {
        print("Poppoing Home on will popo");
        return showDialog(
              context: context,
              builder: (context) => new AlertDialog(
                    title: new Text('Home - Are you sure?'),
                    content: new Text('Do you want to exit'),
                    actions: <Widget>[
                      new FlatButton(
                        onPressed: () => Navigator.pop(context),
                        child: new Text('No'),
                      ),
                      new FlatButton(
                        onPressed: () => exit(0),
                        child: new Text('Yes'),
                      ),
                    ],
                  ),
            ) ??
            false;
      }


... }

您需要重新安排您在WillPopScope中设置应用程序的方式,因为它应该位于MaterialApp和Scaffold中:

应用程序类

你的页面


根据@SnakeyHips的提示,我修改了代码,如下所示,但我需要Scaffold为选项卡导航提供有状态

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(fontFamily: 'Georgia'),
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new _HomePageState();
}

class _HomePageState extends State<HomePage> {

  ....

  @override
  Widget build(BuildContext context) {
    return Scaffold(body: new WillPopScope(
    onWillPop: _onWillPop,
    .... 
  }

 }

MyApp和Home是两个独立的屏幕,与您描述的不同。主页不是MyApp的主体。我把问题改清楚了。那就照我的例子做,把它放在家里吧?很高兴它奏效了!如果您能接受我的回答,我也将不胜感激:推送时我们传递给Navigator的上下文是否重要?例如:在小部件树中从生成器向下传递上下文是否与从有状态小部件生成上下文的功能相同?只是好奇!通常,构建器的上下文应该来自有状态小部件,这样导航器就知道如何跳回有状态小部件上下文。不过,如果你能接受我的答案,那就太好了:
import 'dart:async';
import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return new WillPopScope(
              onWillPop: _onWillPop,
               child:new Center(
              child: new Text("Home Page"),
            ),
          );
  }

  Future<bool> _onWillPop() {
    return showDialog(
          context: context,
          builder: (context) => new AlertDialog(
                title: new Text('Are you sure?'),
                content: new Text('Do you want to exit an App'),
                actions: <Widget>[
                  new FlatButton(
                    onPressed: () => Navigator.of(context).pop(false),
                    child: new Text('No'),
                  ),
                  new FlatButton(
                    onPressed: () => Navigator.of(context).pop(true),
                    child: new Text('Yes'),
                  ),
                ],
              ),
        ) ??
        false;
  }
}
class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(fontFamily: 'Georgia'),
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new _HomePageState();
}

class _HomePageState extends State<HomePage> {

  ....

  @override
  Widget build(BuildContext context) {
    return Scaffold(body: new WillPopScope(
    onWillPop: _onWillPop,
    .... 
  }

 }