Дисклеймер: я все-таки надеюсь, что вы понимаете, для чего и где следует ставить const в dart.

Одним вечером я настраивал сборку приложения с переменными для хранения ключей API. Использовал dart-define и упёрся в проблему: переменные, переданные через dart-define не определены при вызове String.fromEnvironment. И сейчас я расскажу почему.

Спустя 3 часа отладки, множества поисковых запросов, неоднократному прибеганию к AI-ассистентам, я попросил своего коллегу воспроизвести проблему. Мы создали проект и написали:

flutter run --dart-define=TEST=yaUmer

В коде, перед runApp написали:

print(String.fromEnvironment('TEST'))

И после запуска в консоли мы увидели пустую строку.

Тогда мы попробовали установить последнюю версию flutter и воспроизвести ошибку. И она воспроизвелась.

Прошел ещё час и последний запрос к нейронке мне выдал такое предложение:

Проблема в том, что String.fromEnvironment('TEST') не видит значение, переданное через --dart-define, потому что Dart-define переменные доступны только во время компиляции, а не во время выполнения.

Потом правда она несла полную дичь про то, что мы могли неправильно передавать в аргументы запуска данные. Но в этот момент меня осенило. А что позволит нам вшить в программу значение на этапе компиляции? И ответ прост - слово const. Тогда мы отредактировали предыдущий код и теперь он выглядел так:

print(const String.fromEnvironment('TEST'))

И тогда мы увидели в консоли заветное "yaUmer". 4 года разработки на Flutter и сотни тысяч написанных строк кода не дали мне этого заветного знания и не помогли мне решить эту проблему быстро. У всех бывают затупы, и у меня оказался такой. Берегите себя и свое время :)

Это кстати было и в документации: https://dart.dev/libraries/core/environment-declarations#accessing-environment-declarations Однако мы не увидели предложение про const.

Какие выводы можно из этого сделать?

Лучше читайте документацию, в ней, хоть и вскользь, об этом было написано. В новых проектах сразу настраивайте линтер правильно (нам стоило настроить на использование const). Возможно есть линтер буквально на этот факап, если вы знаете такой или напишете его, в буду благодарен. Спасибо, за прочтение, всем доброго дня!

Комментарии (0)


  1. v_chaser
    18.09.2025 06:59

    Уже раз 5 терял половину рабочего дня из-за того, что доку по-диагонали прочитал. Бывает, чо. Щас прошу иишки при рисерче проблем читать документацию кода в первую очередь.