I'm new to both Dart and Flutter so please bear with me if this is off the mark. But I've exhausted my Googlefu and haven't been able to find an answer.
Context
I'm running Dart 2.10.4 and Flutter 1.22.5. At this point I'm just cloning a bunch of example apps from Github and running them locally by
- Running
flutter pub get
- Then hitting Run in Android Studio
I am familiar with package management from other languages and have read the docs about potential differences with Dart, in particular
pub get uses the versions of dependencies locked in it (pubspec.lock) if possible
"if possible" tells me the pubspec.lock
file is not always respected. The behavior I'm familiar with is for an error to be raised "if not possible".
I should mention that none of the repos I've cloned is very new. They all have over a year's history but have all had recent updates.
What happened
In all of the projects, doing a flutter pub get
alters pubspec.lock
. The changes are all upgrading the dependencies to a nullsafety
version. For example boolean_selector
went from 1.0.5
to 2.1.0-nullsafety.1
. This confused the hell out of me at first. Digging into the pubspec.yaml
files of the affected packages revealed that the SDK constraint is indeed satisfiable by my Dart version, e.g. boolean_selector. These version changes broke all of the codebases because of the required
keyword.
Question 1
As I understand it, part of the Null-Safety changes is that the @required
annotation becomes required
. It's also my understanding that these changes don't land until Dart 2.12. So what's happening here? Why do packages release nullsafety
versions for Dart 2.10?
Question 2
The pubspec.lock
file is satisfiable by my current Dart version. To use the boolean_selector
example again. The repo in question locks it to 1.0.5 which has an SDK constraint of sdk: '>=2.0.0 <3.0.0'
. I'm running Dart 2.10. Everything should be fine. Why does pub get
forcefully upgrade it to the latest compatible version?
Question 3
I thought ok maybe required
is an experimental feature we can turn on for Dart 2.10. I read about NNBD and dart migrate
and have tried it. It doesn't seem to do anything about required
and would always error out. I read about dependency_overrides
to use a newer version of analyzer
. I'd get the same errors. I'm clearly missing something. If Dart 2.10 is compatible with required
(as opposed to @required
), how do I make it so?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…