Где проходит передача контекста? - PullRequest
0 голосов
/ 09 мая 2018

Рассмотрим следующий код:

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Welcome to Flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Welcome to Flutter'),
        ),
        body: new Center(
          child: new Text('Hello World'),
        ),
      ),
    );
  }
}

Я понимаю, что Buildcontext является «контекстом» виджета (пожалуйста, исправьте меня, если я ошибаюсь, или уточните подробнее).Я не понимаю, как аргумент «контекст» передается в метод.Предоставляет ли функция runApp «контекст»?

1 Ответ

0 голосов
/ 10 мая 2018

TLDR: Это управляется платформой .

Для тех, кто любит читать:

Начиная с самого начала. Метод runApp берет ваш виджет приложения и вставляет его в дерево, согласно комментарию к методу ( binding.dart ):

Раздуйте указанный виджет и прикрепите его к экрану.

Когда это будет сделано, приложение StatelessWidget (которое, очевидно, является Widget) раздувается в Element (Widget комментарии класса в файле framework.dart )

Каждый раз, когда виджет помещается в дерево, он раздувается в [Элемент], что означает виджет, который включен в дерево несколько раз будет раздуто несколько раз.

Если вы посмотрите на абстрактный класс Element в том же файле репозитория GitHub ( framework.dart ), вы увидите над ним комментарии:

Элементы имеют следующий жизненный цикл:

  • Каркас создает элемент, вызывая [ Widget.createElement ] на виджете, который будет использоваться в качестве начального элемента конфигурации.
  • Фреймворк вызывает [ mount ] для добавления вновь созданного элемент к дереву в данном слоте в данном родителе. [Гора] Метод отвечает за раздувание любых дочерних виджетов и вызов [attachRenderObject] при необходимости, чтобы прикрепить любой связанный рендер объекты в дерево рендеринга.

Эти два метода createElement и mount являются теми, которые отвечают за вызов метода build.

Если вы посмотрите на класс StatelessWidget, вы увидите, что он имеет переопределение для метода createElement ( framework.dart ). Который создает StatelessElement объект и передает себя (this) в качестве параметра конструктора. Обратите внимание, как класс StatelessElement переопределяет метод build и вызывает метод widget.build (в этом случае widget - это виджет вашего приложения, т.е. MyApp). Это все еще не говорит нам, как вызывается метод build. Если вы углубитесь в ComponentElement (класс, который StatelessElement является производным от - framework.dart ), вы увидите переопределенный метод mount. В этом методе (который вызывается платформой) есть вызов метода _firstBuild, который затем вызывает rebuild, этот метод затем вызывает метод performRebuild, что в конечном итоге вызывает метод build.

Легко, правда?

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Это только я соединяю точки. Я не эксперт по Flutter - я буквально начал использовать Flutter неделю назад. Было бы хорошо, если бы некоторые опытные разработчики могли подтвердить или нет, если мое понимание механизмов, стоящих за виджетами, правильное.

РЕДАКТИРОВАТЬ: Ответы на вопросы комментариев

  1. Раздувание (на мой взгляд) - это создание объекта в памяти (так что у фреймворка есть ссылка на него) и рендеринг его на экране.

  2. Да, BuildContext будет StatelessElement, который содержит ссылку на само приложение

Debugging with VS Code - Flutter Redux architecture sample

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