Code Monkey home page Code Monkey logo

latrygin-note's Introduction

Мои Дела

Note - это простое и интуитивно понятное приложение Flutter для управления вашими повседневными заметками. Легко записывайте свои мысли, идеи, списки дел и важную информацию с помощью этого удобного приложения для ведения заметок. Проект был сдела в качестве первой части домашнего задания.

Связаться со мной, чтобы обсудить критерии оценивания

Telegram

Скачать приложение

Скачать APK

Основные функции

  • Отображение списка всех заметок: На главном экране приложения вы увидите список всех созданных заметок. Каждая заметка будет содержать описание, приоритет выполнения и дату создания. Вы также сможете отметить выполненные задачи и удалить ненужные заметки.

  • Добавление новой заметки: Чтобы добавить новую заметку, вы можете воспользоваться быстрым созданием (внизу списка) или нажать на FloatingActionButton и перейти к детальному созданию задачи. Здесь вы сможете указать текст заметки, приоритет выполнения и как срок выполнения.

  • Редактирование существующей заметки: Если вы выберете заметку из списка на главном экране, вы будете перенаправлены на экран редактирования заметки с предварительно заполненными данными этой заметки. Вы сможете внести изменения в заголовок, приоритет и дату.

UI Приложения

Зависимости

Для разработки проекта используются следующие зависимости:

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

Установка и запуск проекта

Следуйте этим инструкциям, чтобы установить и запустить проект на вашем локальном компьютере:

  1. Клонируйте репозиторий с проектом с помощью следующей команды:
git clone https://github.com/latrygin/note.git
  1. Перейдите в каталог проекта:
cd note
  1. Запустите следующую команду, чтобы загрузить зависимости проекта:
flutter pub get
  1. Создать два файла:
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';
  }
}
  1. Подключите свое устройство или эмулятор и выполните следующую команду:
flutter run

Реализация

Код разбит на фичи и слои

Пример, модель Task

lib/domain/entity/task.dart

@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,
  });

Пример, интерфейса для работы с local storage

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);
}

Пример, интерфейса для работы с remote storage

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');
    },
  );
}

latrygin-note's People

Contributors

latrygin avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.