Импорт флаттера: относительный путь или пакет? - PullRequest
6 голосов
/ 11 января 2020

В Flutter, для импорта библиотек в каталоге lib нашего собственного пакета, следует ли использовать относительный импорт

import 'foo.dart'

или импорт пакета?

import 'package:my_app/lib/src/foo.dart'

Указания по дартс рекомендуется использовать относительный импорт:

УКАЗАТЬ относительные пути при импорте библиотек в каталоге lib вашего собственного пакета.

, тогда как Provider пакет говорит всегда использовать импорт пакетов :

  • Всегда использовать импорт пакетов. Пример: import 'package:my_app/my_code.dart';

Есть ли разница, кроме краткости? Почему импорт пакетов уменьшил бы ошибки по сравнению с относительным импортом?

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Это был обход старой ошибки Dart: Flutter: получение состояния верхнего уровня от дочернего объекта возвращает ноль

TL; DR путем смешивания относительного и абсолютного импорта, иногда создаваемого Dart дубликат определения класса.

Это привело к абсурдной строке:

import 'package:myApp/test.dart' as absolute;
import './test.dart' as relative;

void main() {
  print(relative.Test().runtimeType == absolute.Test().runtimeType); // false
}

Поскольку provider полагается на runtimeType для разрешения объектов, то эта ошибка сделала provider невозможно получить объект в некоторых ситуациях.

0 голосов
/ 05 мая 2020

Из тех же Указаний по дротикам , ниже они приводят причину относительного импорта:

Нет серьезных оснований отдавать предпочтение первому - оно просто короче, и мы хотим быть последовательными.

Лично я предпочитаю абсолютный метод, несмотря на то, что он более многословен, так как это означает, что когда я импортирую из разных файлов дротиков (в других папках), я не Необходимо выяснить, где находится импортируемый файл относительно текущего файла. Готовый пример:

У меня есть два файла dart на разных уровнях папок, которые необходимо импортировать themes/style.dart:

Один из них - widgets/animation/box_anim.dart, где относительный путь импорта будет:

import '../../themes/style.dart';

Другой - screens/home_screen.dart с относительным импортом:

import '../themes/style.dart';

Это может сбить с толку, поэтому я считаю, что лучше просто использовать абсолют в обоих файлах, сохраняя его последовательно:

import 'package:myapp/themes/style.dart';

И просто придерживайтесь этого правила повсюду. Так что, в принципе, какой бы метод вы ни использовали - согласованность является ключевой!

Пакет Linter for Dart также имеет , что сказать об этом , но больше о Нельзя смешивать в папке '/ lib':

НЕ избегать относительного импорта файлов в lib /.

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

...