Пакет Dart - Как скрыть внутренние методы и классы? - PullRequest
0 голосов
/ 20 июня 2020

Я разрабатываю пакет для Flutter Apps

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

Пример:

DataService.dart

export class DataService{

    //Must be visible only for my library
    static notifyDataChanged(InternalEvent internalEvent){ ... }

    //Must be visible for anyone
    static addCallbackOnDataChange(onDataChangeCallback) { ... }

}

InternalEvent.dart

//Must be visible only for my library as well
export class InternalEvent {
   ...
}

Ответы [ 3 ]

2 голосов
/ 20 июня 2020

Обычный подход к объявлениям только пакетов - поместить их в библиотеку в каталоге lib/src/, а не экспортировать эту библиотеку. Другие библиотеки в пакете могут импортировать библиотеку только для пакета, но пользователям, не входящим в пакет, не рекомендуется напрямую импортировать библиотеки в lib/src/. (Это не невозможно, просто то, что не рекомендуется, потому что пакет может свободно изменять эти библиотеки без предупреждения).

Если для функций пакета требуется доступ к частным частям библиотеки классов publi c, тогда им потребуется находиться в той же библиотеке. Традиционный способ состоит в том, чтобы объявить обе библиотеки в lib/src/ и экспортировать только те части этой библиотеки, которые необходимо опубликовать. c:

library myPackage;
export "src/allDeclarations" hide Private, Declarations;
// or 
export "src/allDeclarations" show Public, Things;

Обычно вы должны помещать только экспортированные и не экспортируемые объявления в той же библиотеке, если это абсолютно необходимо. В противном случае списки hide / show станут слишком громоздкими, и легко забыть объявление в списке hide.

1 голос
/ 20 июня 2020

У вас есть несколько возможностей:

  • Сделать метод / переменную закрытой, добавив к ней префикс _:

    class _InternalEvent {}
    
  • Используйте директивы hide / show:

    // lib/src/event.dart
    class InternalEvent {}
    
    class VisibleEvent {}
    
    
    // lib/my_package.dart
    export 'src/event.dart' hide InternalEvent; 
    
    OR
    
    export 'src/event.dart' show VisibleEvent;
    
0 голосов
/ 20 июня 2020

просто используйте _ перед именем метода / класса

export class DataService{

    // Private method
    static _notifyDataChanged(InternalEvent internalEvent){ ... }

    // Public method
    static addCallbackOnDataChange(onDataChangeCallback) { ... }

}
// private class
export class _InternalEvent {
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...