Академический Документы
Профессиональный Документы
Культура Документы
ВВЕДЕНИЕ.....................................................................................................................................................................3
ВЫВОД..........................................................................................................................................................................29
2
КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
3
РАСПРОСТРАНЕННЫЕ АРХИТЕКТУРЫ ДЛЯ СОЗДАНИЯ
ПРИЛОЖЕНИЙ
4
взаимодействие было очень удобным и безопасным. В то время как
паттерн проектирования — это то, как создаются компоненты.
5
Рисунок 1 – Схема устройства паттерна MVC
6
MVP (Model View Presenter)
7
Рисунок 2 – Схема устройства паттерна MVP
Как видно из Рисунка 2 схема устройства MVP почти такая же, как и в
случае MVC, но здесь контроллер заменен на презентатор. Представление
является самым верхним уровнем архитектуры, взаимодействует с
пользователем и принимает входные данные, которые передаются
презентеру, и, получая данные из модели, отправляет их обратно в
представление, чтобы представить их пользователю. Таким образом, в
соответствии с этим, можно сказать о MVP, что представление более тесно
связано с моделью.
Ведущий отвечает за привязку модели к представлению. В такой
модели легче проводить модульное тестирование, поскольку взаимодействие
с представлением осуществляется через интерфейс. Обычно одному
представлению соответвует один ведущий. Хотя сложные представления
могут иметь несколько ведущих. MVP еще больше изолирует данные от
представления, и поэтому проще поддается тестированию
8
MVVM (Model View View Model)
9
Для лучшего понимания можно сказать, что модель может отражать только
фактические данные, а не характеристики или какие-либо особенности,
конфигурации, связанные с приложением. Это означает, что вы не можете
манипулировать тем, как данные будут представлены или отформатированы.
Каждый элемент в наборе данных будет представлять свою собственную
модель. В основном модель хранится вдали от логической части для
поддержания аккуратности кода, но иногда она включает в себя и логику
проверки.
Привязка данных концептуально выглядит следующим образом.
Имеется некий элемент управления, например – текстовое поле, в который
мы хотим вывести некоторые данные. Мы настраиваем связь этого поля с
нужным нам свойством некоего объекта, который содержит данные, которые
надо вывести в поле. Текстовое поле называют целевым объектом привязки
или приемником, объект, содержащий данные, называют источником
данных. Существуют разные типы привязки данных:
1. Односторонняя (one way) привязка данных приводит к тому, что
информация берется из источника, направляется в приемник, при
этом, если в приемнике происходит изменение данных, эти
изменения не влияют на источник. Но если информация изменилась
в источнике данных, изменения отразятся и на приемнике.
2. Двусторонняя (two way) привязка, при ней изменения, которым
данные подвергнуться в приемнике, отражаются и на источнике
данных. При этом описание привязок данных осуществляется в
XAML-коде страницы, то есть, программный код для реализации
этого механизма не нужен.
Существуют и другие типы привязки, например, одноразовая (One time) –
данные из источника передаются в приемник один раз, например, при смене
контекста данных или при загрузке приложения, затем связь между ними не
поддерживается. Передачу данных между источником и приемником
выполняют механизмы системы привязки данных. К привязке данных
относится такое понятие как конвертер данных – программный механизм,
которые выполняет преобразование данных.
Представление в паттерне проектирования MVVM представляет собой
интерфейс, который видит конечный пользователь. Этот элемент использует
широкий набор библиотек для более точного, детального представления
данных. Этот элемент использует поведение, связанное с моделью, например,
идентификацию пользователя или ответ на пользовательский ввод данных.
Представление обрабатывает действия пользователя, но только те, что
определены в функциональных возможностях модели.
10
Модель представления является наиболее важным элементом
архитектуры MVVM, который представляет часть View отдельно от Model.
Этот элемент распределяет фактические данные, а части представления -
отформатированные или обновленные данные, являясь контроллером,
выступая интерфейсом между ними. Модель представления связывает
исходные данные, представленные моделью, и их визуальное представление.
При этом модель представления не обладает "знаниями" о том, как именно
данные используются в представлении – то есть в интерфейсе приложения.
Задача модели представления заключается в подготовке данных к
отображению и в предоставлении этих данных представлению, то есть –
интерфейсным механизмам – через систему привязки данных.
То же самое касается команд. В модели представления может быть определен
некий метод, который вызывается каким-либо
элементом управления из представления, но этот метод не имеет информации
о том, какой именно элемент управления
его вызывает. Благодаря подобному разделению представления (интерфейса)
и логики представления (модели представления)
и достигается гибкость работы над различными частями приложения,
созданного по методологии MVVM
Модель представления также имеет доступ к методам, вызовам
функций и свойствам, которые могут помочь поддерживать фактическое
состояние View. Кроме того, подобный высокий уровень доступа также
позволяет манипулировать моделью или модерировать ее в соответствии с
поведением в представлении, одновременно параллельно работая с
представлением.
Поскольку свойства модели и представления поддерживают
постоянную синхронизацию друг с другом, пользователи могут
беспрепятственно взаимодействовать с приложением. Улучшается
отзывчивость.
11
Сравнительный анализ паттернов проектирования
12
АРХИТЕКТУРНЫЕ ОСОБЕННОСТИ FLUTTER.
13
Когда состояние приложения меняется (например, пользователь
переключает тумблер на экране настроек), происходит изменение состояния,
которое вызывает перерисовку пользовательского интерфейса.
Нет никаких императивных изменений самого пользовательского
интерфейса (например, widget.setText) - вы изменяете состояние, и
пользовательский интерфейс перестраивается автоматически с нуля. По сути,
во Flutter мы описываем, как должен выглядеть пользовательский интерфейс
для любого состояния.
Язык программирования Dart.
Для разработки с Flutter используется язык программирования под
названием Dart. Это также язык Google, созданный в октябре 2011 года, но
значительно улучшившийся в последние годы. Dart фокусируется на
развитии вёрстки веб-страниц; его можно с легкостью использовать для
создания мобильных и веб-приложений.
14
Разновидности состояний.
15
Не существует четкого, универсального правила, позволяющего
определить, является ли конкретная переменная эфемерной или состоянием
приложения. Иногда приходится изменять из одного в другое. Например, вы
начнете с некоторого явно эфемерного состояния, но по мере роста
функциональности, его, возможно, придется перевести в состояние
приложения.
Итак, в любом приложении Flutter есть два концептуальных типа
состояния. Эфемерное состояние может быть реализовано с помощью State и
setState() и часто является локальным для одного виджета. Остальное — это
состояние вашего приложения.
Оба типа находят свое место в любом приложении Flutter, и разделение
между ними зависит от ваших собственных предпочтений и сложности
приложения.
16
Управление состояниями.
17
Пакет для управления состояний.
18
Рисунок 6 – Экраны приложения интернет магазина.
Слева направо: экран каталога товаров, экран при выборе товаров и экран корзины.
void myTapHandler() {
var cartWidget = somehowGetMyCartWidget();
cartWidget.updateWith(item);
}
Правильный вариант:
Теперь у MyCart есть только один вариант для создания любой версии
пользовательского интерфейса.
20
Widget build(BuildContext context) {
var cartModel = somehowGetMyCartModel(context);
return SomeWidget(
// только единожды описать интерфейс.
// ···
);
}
Cart
21
@override
Widget build(BuildContext context) {
return SomeWidget(
//создать виджет и передать ссылку на метод.
MyListItem(myTapCallback),
);
}
name: my_name
description: Blah blah blah.
# ...
dependencies:
flutter:
sdk: flutter
provider: ^6.0.0
dev_dependencies:
# ...
22
1. ChangeNotifier — это простой класс, включенный в Flutter SDK, который
предоставляет слушателям уведомления об изменениях. Другими словами,
если что-то является ChangeNotifier, вы можете подписаться на его
изменения (это разновидность Observable - паттерна проектирования). В
провайдере ChangeNotifier — это один из способов инкапсуляции состояния
вашего приложения. Для очень простых приложений можно обойтись одним
ChangeNotifier. В сложных приложениях будет несколько моделей, а значит,
и несколько ChangeNotifier.
В нашем примере приложения для покупок мы хотим управлять
состоянием корзины в ChangeNotifier. Мы создаем новый класс, который
расширяет его, следующим образом:
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => CartModel(),
child: const MyApp(),
),
);
}
void main() {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) =>
CartModel()),
Provider(create: (context) => SomeOtherClass()),
],
child: const MyApp(),
24
),
);
}
return Consumer<CartModel>(
builder: (context, cart, child) {
return Text('Total price: ${cart.totalPrice}');
},
);
25
return Consumer<CartModel>(
builder: (context, cart, child) => Stack(
children: [
// допустим SomeExpensiveWidget очень сложно трудоемко
перерисовать создаем его единожды.
if (child != null) child,
Text('Стоимость: ${cart.totalPrice}'),
],
),
// Build the expensive widget here.
child: const SomeExpensiveWidget(),
);
Непарвильно:
return Consumer<CartModel>(
builder: (context, cart, child) {
return HumongousWidget(
// ...
child: AnotherMonstrousWidget(
// ...
child: Text('Стоимость: ${cart.totalPrice}'),
),
);
},
);
Правильно:
return HumongousWidget(
// ...
child: AnotherMonstrousWidget(
// ...
child: Consumer<CartModel>(
builder: (context, cart, child) {
return Text('Стоимость: ${cart.totalPrice}');
},
),
),
);
Виджет Текст.
Виджет Text позволяет создавать в приложении стилизованный текст.
Виджет Строка, колонка.
Эти гибкие виджеты позволяют создавать гибкие макеты в горизонтальном
(Row) и вертикальном (Column) направлениях.
Дизайн этих объектов основан на веб-модели компоновки flexbox.
Виджет Стек.
Вместо линейной ориентации (по горизонтали или вертикали) виджет Stack
позволяет размещать виджеты друг над другом
в порядке рисования. Вы можете использовать виджет Positioned для
дочерних элементов стека, чтобы расположить их относительно верхнего,
правого, нижнего или левого края стека. Стеки основаны на модели
компоновки абсолютного позиционирования в Интернете.
Виджет Контейнер.
Виджет Container позволяет создать прямоугольный визуальный элемент.
Контейнер можно украсить с помощью BoxDecoration,
например, фоном, границей или тенью. Контейнер также может иметь поля,
набивку и ограничения, применяемые к его размерам. Кроме того, контейнер
может быть преобразован в трехмерном пространстве с помощью матрицы.
27
управляет стопкой виджетов, обозначенных строками, также известными как
"маршруты".
Навигатор позволяет плавно переходить от одного экрана приложения
к другому. Использование виджета MaterialApp совершенно необязательно,
но является очень частой практикой.
Адаптивность приложения
Адаптация приложения для работы на различных типах устройств,
таких как мобильные и настольные, требует работы с мышью и клавиатурой,
а также с сенсорным вводом. Это также означает, что существуют разные
требования относительно визуальной плотности пикселей, выбора
компонентов (например, каскадные меню вместо списков), использования
специфических для платформы функций (например, всплывающих окон
верхнего уровня) и т. д.
28
Алгоритм создания UI в Flutter.
29
Следование стандартам платформы.
Снижение когнитивной нагрузки - благодаря соответствию
существующей модели мышления пользователя, выполнение задач
становится интуитивно понятным, что требует меньше размышлений,
повышает производительность
и снижает разочарование.
30
ВЫВОД
3. Развитые библиотеки.
31
Минусы разработки приложений Flutter
2. Комплексное обновление
3. Ограниченный набор инструментов и библиотек
32
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ
33