Каковы внутренние реализации Navigator.push () и Navigator.pop ()? - PullRequest
0 голосов
/ 23 января 2019

В классе State, несмотря на отсутствие вызова setState (), он перестраивается с новыми элементами, когда виджет возвращается из Navigator.pop (). Как такое могло произойти?

В моем упрощенном коде, приведенном ниже, ListView перестраивается всякий раз, когда я нажимаю кнопку и открываю выдвинутый виджет.

Это потому, что Navigator.push() располагает текущий виджет, а виджет перерисовывается после Navigator.pop()?

class _TestState extends State<Test> {
  List<int> initialList = [];
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FlatButton(
        onPressed: () async {
          var nothing = await Navigator.of(context).push(
            MaterialPageRoute(builder: (_context) => PushedWidget()),
          );
          // the State is rebuilt without calling setState()
          initialList.add(1);
        },
        child: Text('test'),
      ),
      body: Container(
        child: ListView.builder(
          itemCount: initialList.length,
          itemBuilder: (context, idx) {
            return Text('${initialList[idx]}');
          },
        ),
      ),
    );
  }
}

class PushedWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(leading: IconButton(onPressed: () => _pop(context), icon: Icon(Icons.close))),
    );
  }
  void _pop(BuildContext context) {
    Navigator.of(context).pop('popped');
  }
}

Я прочитал документы и коды реализации. Но я не смог найти ответ на этот вопрос.

1 Ответ

0 голосов
/ 23 января 2019

Navigator поддерживает стековую историю дочерних виджетов. Я считаю, что вы уже знаете о структуре данных стека. Navigator.push и Navigator.push работает так же, как стек. Когда мы переходим на другой экран, мы используем методы push, и виджет Navigator добавляет новый экран в верхнюю часть стека. Принимая во внимание, что методы pop удаляют этот экран из стека.

...