Давайте создадим приложение Todo

Примечание: Перед началом, если вы хотите увидеть ссылку на этот проект, вы можете посетить проект здесь. Также для этого проекта на YouTube я загрузил видео, так что вы также можете посмотреть его здесь.

Всем привет. В этой статье мы создадим приложение Todo с помощью Riverpod + StateNotifier + Freezed + Domain Driven Design (DDD). Когда я пишу эту статью, я также загружаю видео, связанное с этой статьей. Так что, что хочешь, можешь делать, можешь и читать, и смотреть.

Обо всем по порядку, В этой статье я не буду все объяснять, так как есть видео. Я просто создаю архитектуру и пытаюсь научить создавать Riverpod с некоторыми другими вещами.

Хорошо, давайте начнем.

Приложение Todo

Я делаю приложение для дел, потому что оно простое, верно? Заявку COUNTER создавать не хочу, так как встречных заявок много, а больше видеть не хочу. Итак, я создам простое приложение для работы.

Также на моем GitHub есть еще один контент, rickandmortyapi, и он снова связан с Riverpod + StateNotifier + Freezed + Domain Driven Design (DDD). Я также буду писать статьи и загружать видео, но это приложение важно для понимания того, как мы можем использовать Riverpod.

Во-первых, давайте посмотрим на нашу архитектуру (папки):

Здесь у нас есть папка приложения для бизнес-логики. Домен, презентация, возможно, инфраструктура и т. д. Они хорошо описаны ЗДЕСЬ (часть файловой структуры).

Далее, после создания ВИДЖЕТОВ (я имею в виду базовый пользовательский интерфейс), мы можем перейти к реальному вопросу:

Как мы можем одновременно использовать Riverpod + StateNotifier + Freezed + Domain Driven Design (DDD).

Примечание. Для этого проекта вот файл pubspec.yaml (для пакетов, если вы хотите их использовать):

Первым делом создадим папку домена, в ней есть несколько моделей.

После создания модели нам нужно запустить следующий код:

flutter packages pub run build_runner build — delete-conflicting-outputs

…и ошибки уйдут.

Во-вторых, у нас есть файлы папки приложения.

Давайте также создадим их. Когда вы создаете эту архитектуру, вам нужно начать с создания файла состояния, потому что вы можете запутаться (Это просто предложение).

Вот наш файл todo_state.dart:

После этого создайте файл todo_event.dart:

После создания состояния задачи и события задачи нам нужно запустить следующий код:

flutter packages pub run build_runner build — delete-conflicting-outputs

Ошибки уйдут.

Теперь последнее, что нужно сделать, — это раздел уведомления о состоянии. Наше состояние todo, поэтому мы можем переименовать его в TodoNotifier.

Кроме того, создайте файл todo_notifier.dart:

Здесь нам не нужно запускать build runner бла-бла, он нам не нужен.

У нас есть уведомитель, состояние, события и модели. Теперь мы можем создать наш provider, а после этого мы можем получить доступ к этим состояниям, событиям и т. д. через Provider.

В папке провайдера создайте todo_provider.dart :

Здесь мы используем StateNotifierProvider, потому что хотим получить доступ к нашему уведомителю, а также к его состоянию. Итак, мы создали StateNotifierProvider с нашими TodoNotifier и TodoState. Как видите, он также возвращает TodoNotifier().

Последнее, что нам нужно сделать, вызвать наше состояние, отправить события, используя нашего провайдера, потому что мы почти закончили!

Давайте переместим папку main.dart.

Если вы хотите использовать дерево Riverpod, вы должны обернуть все вещи ProviderScope().

Просто наш файл main.dart находится здесь:

Далее мы можем переместить папку презентации.

Вот наш app_widget (основной файл):

Конечно же, не забудьте импортировать нужные вещи!

Более того, у нас есть home_page:

У нас есть переменная final todoList. Мы используем метод ref.watch, чтобы получить STATE, а не METHOD. Если вы хотите получить доступ к своему уведомителю, у которого есть ваши методы и функции, вам нужно использовать код yourprovider.notifier. Для состояния используйте только ref.watch(yourProvider). Иногда также может быть полезен метод select.

Например, мы используем метод select, потому что хотим смотреть только todoList, а не все состояние.

В файле home_page.dart у нас есть и другие части, такие как секции TodosActionPart и TodosPart.

В разделе TodosActionPart у нас есть кнопка и textfield. Мы не используем onChanged, так как у нас есть TextfieldController, и мы держим наш текст здесь.

Когда мы используем Riverpod, если мы используем кнопку или onTap, или onClick, это не имеет значения, мы не можем использовать watch. Не используйте его. Ничего не слушаем, просто нажимаем кнопку например, и все. Для получения дополнительной информации перейдите по ссылке riverpod.dev.

Мы используем provider.notifier для доступа к уведомлению. Затем мы вызываем нашу функцию, имя которой mapEventsToState. Сначала мы добавляем событие TodoTitleChanged, а затем добавляем событие AddTodo.

Для файла todos_part.dart мы используем то же самое.

Это все для меня. Также вы можете посмотреть мои приложения, созданные с помощью Riverpod, здесь.

Спасибо за чтение, следите за обновлениями!