Build () не запускается снова при возврате на страницу с помощью кнопки возврата на панели приложений, Flutter - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь заставить приложение, указанное ниже, печатать Build при возврате на главную страницу с одной из других страниц.

import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(
  initialRoute: '/Home',
  routes: {
    '/Home': (context) => Home(),
    '/First': (context) => First(),
    '/Second': (context) => Second(),
  },
),);


class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  void initState() {
    super.initState();
    print('Initialisation');
  }
  @override
  Widget build(BuildContext context) {
    print('Build');
    return Scaffold(
      appBar: AppBar(title: Text('Homepage')),
      body: Center(
        child: RaisedButton(
          onPressed: () {
            Navigator.pushNamed(context, '/First');
          },
          child: Text('Move to the first page'),
        ),
      ),
    );
  }
}

class First extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('First')),
      body: Center(
        child: RaisedButton(
          onPressed: () {
            Navigator.pushNamedAndRemoveUntil(context, '/Second', ModalRoute.withName('/Home'));
          },
          child: Text('Move to the second page'),
        ),
      ),
    );
  }
}

class Second extends StatefulWidget {
  @override
  _SecondState createState() => _SecondState();
}

class _SecondState extends State<Second> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Second')),
    );
  }
}

Прямо сейчас я считаю, что возможно, аспект leading виджета AppBar() можно отредактировать так, чтобы это могло произойти, но я действительно не уверен. Буду очень признателен за ваше время и любые предложения, которые у вас могут быть.

1 Ответ

0 голосов
/ 07 августа 2020

Это сделано намеренно - когда вы создаете «страницу» и sh другую страницу поверх нее, а затем выдвигаете новую страницу, вы хотите, чтобы страница внизу имела то же состояние, что и раньше, но обрабатывала результат pop.

Для этого вы можете дождаться результата вызова Navigator.pushNamed.

Это будет выглядеть примерно так:

onPressed:: () async {
  final result = await Navigator.pushNamed(context, '/First');
  // this will be after popping back to this page
  print("pop result: $result");
}

Следует знать, что в части onPressed после pop ваш код может выполняться во время цикла сборки, поэтому вы должны убедиться, что если вы вызываете setState или Navigator.push или что-то еще нравится, вы делаете это после того, как отложили этот первый запуск.

Вы можете сделать это либо в отложенном будущем, либо с помощью Планировщика

... 
await Future.delayed(Duration.zero);
(your code here)

Или

SchedulerBinding.instance.addPostFrameCallback((duration) => (your code here))
...