Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
p0dyakov committed May 16, 2023
1 parent eacf15a commit 7985cba
Showing 1 changed file with 46 additions and 64 deletions.
110 changes: 46 additions & 64 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,37 +27,34 @@
* [Правила именования](#--1)
* [Never](#never)
* [Covariant](#covariant)
* [Deferred](#deferred)
* [Аннотации](#-4)
- [Flutter](#flutter)
* [Stateless vs Stateful](#stateless-vs-stateful)
* [Жизненный цикл Stateful-виджета](#-stateful-)
* [BuildContext](#buildcontext)
* [InheritedWidget](#inheritedwidget)
* [Деревья ](#-5)
* [Деревья](#-5)
* [Widget](#widget)
* [Element](#element)
* [RenderObject](#renderobject)
* [Виды виджетов](#--2)
* [Виды элементов](#--3)
* [Жизненный цикл Element-а](#-element-)
* [Режимы сборки ](#--4)
* [GlobalKeys](#globalkeys)
* [LocalKeys](#localkeys)
* [Режимы сборки](#--4)
* [Устройство Flutter под капотом ](#-flutter-)
* [Модель выполнения во Flutter](#-flutter)
* [Package vs Plugin](#package-vs-plugin)
* [Shared vs Transitive зависимости](#shared-vs-transitive-)
* [FFI Plugin](#ffi-plugin)
* [Этапы анимации](#--5)
* [Виды анимаций](#--6)
* [Что такое Tween](#-tween)
* [Tween анимации](#tween-)
* [CustomPaint](#custompaint)
* [Sliver Protocol](#sliver-protocol)
* [WidgetsFlutterBinding](#widgetsflutterbinding)
* [Bindings](#bindings)
* [Каналы платформы](#--7)
* [Устройство Flutter под капотом ](#-flutter-)
* [Модель выполнения во Flutter](#-flutter)
* [Построение кадра](#--8)
* [Расчёт макета](#--9)
* [BuildOwner](#buildowner)
Expand All @@ -66,7 +63,7 @@
* [Task Runners](#task-runners)
- [Асинхронность](#-6)
* [Виды операций](#--11)
* [Future ](#future)
* [Future](#future)
* [Конструкторы Future](#-future)
* [Event Loop](#event-loop)
* [Completer](#completer)
Expand All @@ -76,7 +73,7 @@
- [Многопоточность](#-7)
* [Многопоточность в Dart и Flutter ](#-dart-flutter)
* [Isolate](#isolate)
* [Compute ](#compute)
* [Compute](#compute)
* [Проблемы многопоточности](#--12)
- [Архитектура](#-8)
* [Архитектура](#-9)
Expand Down Expand Up @@ -265,11 +262,6 @@
### Covariant
`Covariant` - это ключевое слово в dart, которое указывает на то, что тип возвращаемого значения может быть изменен на более узкий тип в подклассе.

---
<!-- TOC --><a name="deferred"></a>
### Deferred
`Deferred` - это ключевое слово в dart, позволяющее загрузить библиотеку только тогда, когда она будет использована

---
<!-- TOC --><a name="-4"></a>
### Аннотации
Expand Down Expand Up @@ -317,7 +309,7 @@

---
<!-- TOC --><a name="-5"></a>
### Деревья
### Деревья
![](https://docs.flutter.dev/assets/images/docs/arch-overview/trees.png)
- `Widget Tree` состоит из `Widget`, которые используются для описания пользовательского интерфейса
- `Element Tree` состоит из `Element`, которые управляют жизненым циклом виджета и связывают виджеты и объекты рендеринга.
Expand Down Expand Up @@ -392,13 +384,6 @@
6. Когда элемент считается неактивным, он не находится на экране. Элемент может находиться в неактивном состоянии только до конца текущего фрейма, если за это время он остается неактивным, он демонтируется (unmount), после этого считается несуществующим и больше не будет включен в дерево.
7. При повторном включении в дерево элементов, например, если элемент или его предки имеют глобальный ключ, он будет удален из списка неактивных элементов, будет вызван метод activate, и рендер объект, сопоставленный данному элементу, снова будет встроен в дерево рендеринга. Это означает, что элемент должен снова появиться на экране.

---
<!-- TOC --><a name="--4"></a>
### Режимы сборки
- `Debug` (`JIT`) для разработки
- `Release` (`AOT`) для публикации приложения
- `Profile` (`AOT`) для анализа производительности

---
<!-- TOC --><a name="globalkeys"></a>
### GlobalKeys
Expand All @@ -412,18 +397,48 @@
- `UniqueKey` - это ключ, который равен только самому себе
- `ObjectKey` - это ключ, который используется для привязки идентификатора виджета к идентификатору объекта, используемого для создания этого виджета

---
<!-- TOC --><a name="--4"></a>
### Режимы сборки
- `Debug` (`JIT`) для разработки
- `Release` (`AOT`) для публикации приложения
- `Profile` (`AOT`) для анализа производительности

---
<!-- TOC --><a name="-flutter-"></a>
### Устройство Flutter под капотом
![image](https://user-images.githubusercontent.com/80569772/203052487-937d5923-9571-4752-9762-f0d6637b675e.png)

`Уровень фреймворка` — всё, с чем мы работаем в момент написания приложения, и все служебные классы, позволяющие взаимодействовать написанному нами с уровнем движка. Всё, относящееся к данному уровню написано на Dart. `Flutter Framework` взаимодействует с `Flutter Engine` через слой абстракции, называемый `Window`

`Уровень движка` — более низкий уровень, чем уровень фреймворка, содержит классы и библиотеки, позволяющие работать уровню фреймворка. В том числе виртуальная машина Dart, Skia и тд.

`Уровень платформы` — специфичные механизмы, относящиеся к конкретной платформе запуска.

`Flutter Engine` уведомляет `Flutter Framework`, когда:
- Событие, представляющее интерес, происходит на уровне устройства (изменение ориентации, изменение настроек, проблема с памятью, состояние работы приложения…)
- Какое-то событие происходит на уровне стекла (=жест)
- Канал платформы отправляет некоторые данные
- Но также и в основном, когда Flutter Engine готов к рендерингу нового кадра

---
<!-- TOC --><a name="-flutter"></a>
### Модель выполнения во Flutter
1. Создается и запускается новый процесс — Thread (Isolate). Это единственный процесс, в котором будет выполняться ваше приложение.
2. Инициализируются две очереди (Queues) с именами MicroTask (микрозадания)
и Event (событие), тип очередей FIFO (прим.: first in first out, т.е. сообщение,
пришедшие раньше, будут раньше обработаны)
3. Исполняется функция main()
4. Запускается Event Loop (цикл событий). Он управлет порядком исполнения вашего
кода, в зависимости от содержимого двух очередей: MicroTask и Event. Представляет собой "бесконечный" цикл.
5. Event Loop с определённой частотой проверяет MicroTask и Event. Если есть что-то код в MicroTask, то оно выполняется перед очередью Event.

---
<!-- TOC --><a name="package-vs-plugin"></a>
### Package vs Plugin
- `Package` написан только на dart
- `Plugin` использует dart и специфичный код для платформы

---
<!-- TOC --><a name="shared-vs-transitive-"></a>
### Shared vs Transitive зависимости
- `Shared Dependencies` скачиваются напрямую
- `Transitive Dependencies` скачиваются со сторонними пакетами

---
<!-- TOC --><a name="ffi-plugin"></a>
### FFI Plugin
Expand Down Expand Up @@ -464,12 +479,6 @@
<!-- TOC --><a name="custompaint"></a>
### CustomPaint
`CustomPaint` - это класс, который создает «холст» для рисования. В методе `paint` в качестве аргументов поступает `canvas`, который позволяет рисовать различные фигуры

---
<!-- TOC --><a name="sliver-protocol"></a>
### Sliver Protocol
- `SliverConstraints` - это класс, описывающий ограничения и текущее состояние скролла для `RenderSliver` по отношению к viewport
- `SliverGeometry` - это класс, описывающий какие размеры занимает `RenderSliver`

---
<!-- TOC --><a name="widgetsflutterbinding"></a>
Expand Down Expand Up @@ -507,6 +516,7 @@

`GestureBinding` отвечает за работу с подсистемой жестов.

---
<!-- TOC --><a name="--7"></a>
### Каналы платформы

Expand All @@ -530,34 +540,6 @@

[Подробнее](https://habr.com/ru/post/666272/)

<!-- TOC --><a name="-flutter-"></a>
### Устройство Flutter под капотом
![image](https://user-images.githubusercontent.com/80569772/203052487-937d5923-9571-4752-9762-f0d6637b675e.png)

`Уровень фреймворка` — всё, с чем мы работаем в момент написания приложения, и все служебные классы, позволяющие взаимодействовать написанному нами с уровнем движка. Всё, относящееся к данному уровню написано на Dart. `Flutter Framework` взаимодействует с `Flutter Engine` через слой абстракции, называемый `Window`

`Уровень движка` — более низкий уровень, чем уровень фреймворка, содержит классы и библиотеки, позволяющие работать уровню фреймворка. В том числе виртуальная машина Dart, Skia и тд.

`Уровень платформы` — специфичные механизмы, относящиеся к конкретной платформе запуска.

`Flutter Engine` уведомляет `Flutter Framework`, когда:
- Событие, представляющее интерес, происходит на уровне устройства (изменение ориентации, изменение настроек, проблема с памятью, состояние работы приложения…)
- Какое-то событие происходит на уровне стекла (=жест)
- Канал платформы отправляет некоторые данные
- Но также и в основном, когда Flutter Engine готов к рендерингу нового кадра

---
<!-- TOC --><a name="-flutter"></a>
### Модель выполнения во Flutter
1. Создается и запускается новый процесс — Thread (Isolate). Это единственный процесс, в котором будет выполняться ваше приложение.
2. Инициализируются две очереди (Queues) с именами MicroTask (микрозадания)
и Event (событие), тип очередей FIFO (прим.: first in first out, т.е. сообщение,
пришедшие раньше, будут раньше обработаны)
3. Исполняется функция main()
4. Запускается Event Loop (цикл событий). Он управлет порядком исполнения вашего
кода, в зависимости от содержимого двух очередей: MicroTask и Event. Представляет собой "бесконечный" цикл.
5. Event Loop с определённой частотой проверяет MicroTask и Event. Если есть что-то код в MicroTask, то оно выполняется перед очередью Event.

---
<!-- TOC --><a name="--8"></a>
### Построение кадра
Expand Down Expand Up @@ -642,7 +624,7 @@

---
<!-- TOC --><a name="future"></a>
### Future
### Future
`Future` - это обёртка над результатом выполнения асинхронной операции. Код Future НЕ выполняется параллельно, а выполняется в последовательности, определяемой Event Loop.
Состояния Future:
- Uncompleted - операция не завершена
Expand Down Expand Up @@ -709,7 +691,7 @@

---
<!-- TOC --><a name="compute"></a>
### Compute
### Compute
`Compute` - это функция, которая создаёт изолят и запускает переданный код.

---
Expand Down

0 comments on commit 7985cba

Please sign in to comment.