Приложение завершает работу, не вызывая никаких обратных вызовов при нажатии на устройство, трепетание - PullRequest
0 голосов
/ 28 ноября 2018

Точка входа в приложение:

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 я хочу предупредить пользователя о нажатии назад и предупредить, если он хочет выйти из приложения.Но ни _onWillPop, ни dispose не будут вызваны

Домой не является отдельным экраном от 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;
      }


... }

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Получив подсказку от @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,
    .... 
  }

 }
0 голосов
/ 28 ноября 2018

Вам необходимо изменить порядок настройки приложения, так как WillPopScope должно быть в пределах MaterialApp и Scaffold:

Класс приложения

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        theme: ThemeData.dark(),
        home: Scaffold(
          body: HomePage(),
        ),
      );
  }
}

Ваша страница

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;
  }
}

Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...