Note - это простое и интуитивно понятное приложение Flutter для управления вашими повседневными заметками. Легко записывайте свои мысли, идеи, списки дел и важную информацию с помощью этого удобного приложения для ведения заметок. Проект был сдела в качестве первой части домашнего задания.
![](https://private-user-images.githubusercontent.com/114460271/249441424-e1dd5830-9035-4160-932e-48330e31d855.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTE2MzExMDYsIm5iZiI6MTcxMTYzMDgwNiwicGF0aCI6Ii8xMTQ0NjAyNzEvMjQ5NDQxNDI0LWUxZGQ1ODMwLTkwMzUtNDE2MC05MzJlLTQ4MzMwZTMxZDg1NS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwMzI4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDMyOFQxMzAwMDZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iMTdlODE5YWMwY2Y0YmFkMGJlYTQ0ODAyMGYyNmQ1MWE2Yzk2NjliMDJiNzZmNWFmYzhiNzc1MzM5OTc1MWVkJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.KxuKWh0HZpaup-c-IU906ZVUsn8Ss23wHFfUFyqdo4s)
-
Отображение списка всех заметок: На главном экране приложения вы увидите список всех созданных заметок. Каждая заметка будет содержать описание, приоритет выполнения и дату создания. Вы также сможете отметить выполненные задачи и удалить ненужные заметки.
-
Добавление новой заметки: Чтобы добавить новую заметку, вы можете воспользоваться быстрым созданием (внизу списка) или нажать на FloatingActionButton и перейти к детальному созданию задачи. Здесь вы сможете указать текст заметки, приоритет выполнения и как срок выполнения.
-
Редактирование существующей заметки: Если вы выберете заметку из списка на главном экране, вы будете перенаправлены на экран редактирования заметки с предварительно заполненными данными этой заметки. Вы сможете внести изменения в заголовок, приоритет и дату.
![](https://private-user-images.githubusercontent.com/114460271/246169497-ef4ce6ba-cbdc-40be-8edd-4d5d157bedbc.jpeg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTE2MzExMDYsIm5iZiI6MTcxMTYzMDgwNiwicGF0aCI6Ii8xMTQ0NjAyNzEvMjQ2MTY5NDk3LWVmNGNlNmJhLWNiZGMtNDBiZS04ZWRkLTRkNWQxNTdiZWRiYy5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAzMjhUMTMwMDA2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZjE4OGE4NTRmMzlkNTA4NmNjYTY2YTAwOTdkMmQxZTA4MzE4NTIwMGRlYzMyYTczMjk3NjQxOTQ1MmVlYWU5OSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.5hscngwgb4SZA8ujnQab_IrsTb-J6iek0qndVgTuEps)
![](https://private-user-images.githubusercontent.com/114460271/246169526-151fd0c7-fb27-483f-9526-60739f44a37d.jpeg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTE2MzExMDYsIm5iZiI6MTcxMTYzMDgwNiwicGF0aCI6Ii8xMTQ0NjAyNzEvMjQ2MTY5NTI2LTE1MWZkMGM3LWZiMjctNDgzZi05NTI2LTYwNzM5ZjQ0YTM3ZC5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAzMjhUMTMwMDA2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NzlmNTcyMzRhMjRmMDZiZWE2NTBhMjIxNjcyMzU1ODc5NTM2NTRmN2NhNzcxNGE4MDMyYjMyOTYxMmViN2I3YSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.0fHulw0IEuLB22y0fY-IcVozCWwGmnmTyS2b1lHZdy8)
![](https://private-user-images.githubusercontent.com/114460271/246169549-6a158bb5-1f0a-4914-8110-e52fc4976cf0.jpeg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTE2MzExMDYsIm5iZiI6MTcxMTYzMDgwNiwicGF0aCI6Ii8xMTQ0NjAyNzEvMjQ2MTY5NTQ5LTZhMTU4YmI1LTFmMGEtNDkxNC04MTEwLWU1MmZjNDk3NmNmMC5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAzMjhUMTMwMDA2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NDI4MzQzMWVkY2IzYmZkNmRkMjkzOWViOTA0YjM3NTdkMDYyMTE0MWRiOWM2YjYxMzlmYjM5YTdiYTBjOWIzMSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.W0OBRuGcVWbZwx2Odg5jfBtQ3jFqxOK5SZbTOk0YrHA)
![](https://private-user-images.githubusercontent.com/114460271/246169566-96a2f889-6926-41c4-b3d0-f5da39928115.jpeg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTE2MzExMDYsIm5iZiI6MTcxMTYzMDgwNiwicGF0aCI6Ii8xMTQ0NjAyNzEvMjQ2MTY5NTY2LTk2YTJmODg5LTY5MjYtNDFjNC1iM2QwLWY1ZGEzOTkyODExNS5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAzMjhUMTMwMDA2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MzZiYjdjMTg5YjlkMzlmNTQ3NjFkYmEyNzYyNmYyZGUwMjViMDY4MGNhYjM3ZmMyZTkwM2JjZjQxNjc5MzA5ZiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.N8Y1H36d0PCwv7HfXeRFgSCGZLCNDnmAKaAZlPsQJ4o)
![](https://private-user-images.githubusercontent.com/114460271/246169583-69231d12-f1fe-4873-aea8-1d38774e99f5.jpeg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTE2MzExMDYsIm5iZiI6MTcxMTYzMDgwNiwicGF0aCI6Ii8xMTQ0NjAyNzEvMjQ2MTY5NTgzLTY5MjMxZDEyLWYxZmUtNDg3My1hZWE4LTFkMzg3NzRlOTlmNS5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAzMjhUMTMwMDA2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9OTEzMWNhZjU0MjIxYTQzZmI4OTg5NDI2N2YxMWIxZmNkODljMTdlN2VmMmMyNzA4ZjU2OWU0OWJmYmU2MjRlYSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.ADX1uRP7Nphi7S82PKrPhsZ_VaeZVJWVRkz5M001lD0)
![](https://private-user-images.githubusercontent.com/114460271/246169599-0663f9e1-81d0-44fe-acf1-70f701d6342e.jpeg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTE2MzExMDYsIm5iZiI6MTcxMTYzMDgwNiwicGF0aCI6Ii8xMTQ0NjAyNzEvMjQ2MTY5NTk5LTA2NjNmOWUxLTgxZDAtNDRmZS1hY2YxLTcwZjcwMWQ2MzQyZS5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAzMjhUMTMwMDA2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ODM5MTMzMzQ3YTQzYThiODUxMzRlMTgwZjliYTkyNzdmZDUxYTIzNzdlZmViZTYwZmMxNGUyOTI2YTA1MGViMiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.5L3eA1HRORjgpWLa74unHTgbMbp60hGrfd8d4mxcRg0)
![](https://private-user-images.githubusercontent.com/114460271/246169633-33b86bbd-c494-4c26-8df0-dd843d035ec0.jpeg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTE2MzExMDYsIm5iZiI6MTcxMTYzMDgwNiwicGF0aCI6Ii8xMTQ0NjAyNzEvMjQ2MTY5NjMzLTMzYjg2YmJkLWM0OTQtNGMyNi04ZGYwLWRkODQzZDAzNWVjMC5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDAzMjhUMTMwMDA2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZjJjZmJmNzA2NzFkZjljNTAyN2ZmZThhMjg1MTQ5NWZhNzcyYWZiZjJiZTRkZDMyZDc0ZjdkNDUzNzY1NjM0ZSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.9jFHsFVCbaiib0TCorYH1pvSWOyJXVGr6_r6ivfCCRQ)
Для разработки проекта используются следующие зависимости:
version: 2.0.0+2
environment:
sdk: '>=3.0.3 <4.0.0'
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
cupertino_icons: ^1.0.2
equatable: ^2.0.5
bloc: ^8.1.2
flutter_bloc: ^8.1.3
logger: ^1.4.0
intl: ^0.18.0
dio: ^5.2.0
shared_preferences: ^2.1.2
uuid: ^3.0.7
device_info_plus: ^9.0.2
hive: ^2.2.3
hive_flutter: ^1.1.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
build_runner: ^2.4.5
hive_generator: ^2.0.0
- domain
- api // Dio, интерсепторы, apiClient
- entity
- service //Контроллер для работы с сервером
- provider //Контроллер для работы с локальным хранилищем
- screen // Папка экранов
- note // Экран
- cubit // Модель экрана
- view // Главные элементы экрана
- widget //Дополнительные элементы экрана
- notes
- ...
- utils
- exception
- l10n
- logger
- navigation
- theme
Следуйте этим инструкциям, чтобы установить и запустить проект на вашем локальном компьютере:
- Клонируйте репозиторий с проектом с помощью следующей команды:
git clone https://github.com/latrygin/note.git
- Перейдите в каталог проекта:
cd note
- Запустите следующую команду, чтобы загрузить зависимости проекта:
flutter pub get
- Создать два файла:
touch lib/domain/api/client/token.dart
token.dart
abstract class Token {
static const String _token = 'your_token';
static String get token => _token;
}
touch lib/domain/api/client/url.dart
url.dart
abstract class URLs {
static const String getAll = 'https://[path]/list';
static const String patch = 'https://[path]/list';
static const String post = 'https://[path]/list';
static String get(String id) {
return 'https://[path]/list/$id';
}
static String delete(String id) {
return 'https://[path]/list/$id';
}
static String put(String id) {
return 'https://[path]/list/$id';
}
}
- Подключите свое устройство или эмулятор и выполните следующую команду:
flutter run
Пример, модель Task
@HiveType(typeId: 1)
class Task {
@HiveField(0)
final String id;
@HiveField(1)
final String text;
@HiveField(2)
final TaskImportant importance;
@HiveField(3)
final DateTime? deadline;
@HiveField(4)
final bool done;
@HiveField(5)
final String? color;
@HiveField(6)
final DateTime? createdAt;
@HiveField(7)
final DateTime? changedAt;
@HiveField(8)
final String? lastUpdatedBy;
Task({
required this.id,
required this.text,
this.importance = TaskImportant.basic,
this.deadline,
this.done = false,
this.color,
this.createdAt,
this.changedAt,
this.lastUpdatedBy,
});
import 'package:note/domain/entity/task.dart';
abstract class TaskProviderImpl {
Future<List<Task>> getAll();
Future<Task> getAt(String id);
Future<Task> updateAt(Task task);
Future<void> removeAt(String id);
Future<Task> create(Task task);
Future<List<Task>> patch(List<Task> tasks);
}
import 'package:note/domain/entity/task.dart';
abstract class TaskServiceImpl {
Future<TaskListResponse> getAll();
Future<TaskResponse> get(String id);
Future<TaskResponse> put(Task request);
Future<TaskResponse> delete(String id);
Future<TaskResponse> post(Task request);
Future<TaskListResponse> patch(TaskListRequest request);
}
Минимально настроено логирование в файле lib/utils/logger/logger.dart , но использовано во всех необходимых местах
import 'package:logger/logger.dart';
Logger logger = Logger(
printer: PrettyPrinter(
methodCount: 0,
printTime: true,
),
);
Логирование перемещения между экранами:
class NavigationLogger extends NavigatorObserver {
@override
void didPush(
Route<dynamic> route,
Route<dynamic>? previousRoute,
) {
logger.i('$NavigationLogger.didPush: ${route.settings.name}');
}
@override
void didPop(
Route<dynamic> route,
Route<dynamic>? previousRoute,
) {
logger.i('$NavigationLogger.didPop: ${route.settings.name}');
}
...
В API:
Future<Response<Map<String, dynamic>>> post(
String path, {
Map<String, dynamic>? data,
}) async {
try {
logger
..v('POST: $path')
..v(data);
final response = await _https.post<Map<String, dynamic>>(
path,
data: data,
);
logger.v(response.data);
return response;
} on DioException catch (e) {
throw e.error as Exception;
}
}
И main.dart
import 'app.dart';
void main() {
runZonedGuarded(
() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
runApp(
App(
taskProvider: TaskProvider(),
taskService: TaskService(),
localRevisionProvider: LocalRevisionProvider(),
revisionProvider: RevisionProvider(),
),
);
},
(error, stackTrace) {
log(
error.toString(),
error: error,
stackTrace: stackTrace,
);
logger.e('main: $error');
},
);
}