@@ -68,6 +68,25 @@ class VersionSolver {
6868 for (final package in _root.transitiveWorkspace) package.name: package,
6969 };
7070
71+ /// Set of direct dependencies from root pubspec.yaml
72+ late final Set <String > _rootDirectDependencies = _root.pubspec.dependencies
73+ .keys.toSet ();
74+
75+ /// Returns true if the root's direct dependency for [packageName] is stable
76+ /// (not prerelease)
77+ bool _isRootDirectDependencyStable (String packageName) {
78+ final dep = _root.pubspec.dependencies[packageName];
79+ if (dep == null ) return false ;
80+ final constraint = dep.constraint;
81+ if (constraint is Version ) {
82+ return ! constraint.isPreRelease;
83+ }
84+ if (constraint is VersionRange && constraint.min != null ) {
85+ return ! constraint.min! .isPreRelease;
86+ }
87+ return false ;
88+ }
89+
7190 /// The lockfile, indicating which package versions were previously selected.
7291 final LockFile _lockFile;
7392
@@ -398,7 +417,14 @@ class VersionSolver {
398417
399418 PackageId ? version;
400419 try {
401- version = await _packageLister (package).bestVersion (package.constraint);
420+ // Prereleases are allowed only if not direct or not stable.
421+ final isDirect = _rootDirectDependencies.contains (package.name);
422+ final isStable = _isRootDirectDependencyStable (package.name);
423+ final allowPrereleases = ! (isDirect && isStable);
424+ version = await _packageLister (package).bestVersion (
425+ package.constraint,
426+ allowPrereleases: allowPrereleases,
427+ );
402428 } on PackageNotFoundException catch (error) {
403429 _addIncompatibility (
404430 Incompatibility ([
0 commit comments