chore: adopt Dart 3.9 toolchain — honest floor + tall-style reformat (T-353)

Raise the declared minimums in pubspec.yaml to what our deps already
require: Flutter >=3.35.0 / Dart >=3.9.0 (was 3.19.0 / 3.5.0). alchemist
0.12 needs Flutter 3.32; Dart 3.9 first ships in Flutter 3.35, so 3.35 is
the binding floor. Pin the exact build toolchain in .fvmrc (Flutter
3.44.1).

Moving to the Dart 3.9 language level switches `dart format` to the new
"tall" style and enables two new lints. This commit is the resulting
mechanical churn, isolated from any behaviour change:
  - whole-tree `dart format` reformat (tall style)
  - `dart fix` for unnecessary_underscores + use_null_aware_elements

No runtime behaviour change; `make test` green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-11 12:11:53 +02:00
co-authored by Claude Opus 4.8
parent bcea5f15b7
commit 6d0ebab721
444 changed files with 7587 additions and 12849 deletions
+5 -25
View File
@@ -2,13 +2,7 @@ import 'package:clide/widgets/src/multitab_controller.dart';
import 'package:flutter_test/flutter_test.dart';
MultitabEntry<String> entry(String id, {bool closeable = true, bool reorderable = true}) {
return MultitabEntry<String>(
id: id,
title: id,
payload: id,
closeable: closeable,
reorderable: reorderable,
);
return MultitabEntry<String>(id: id, title: id, payload: id, closeable: closeable, reorderable: reorderable);
}
void main() {
@@ -94,31 +88,20 @@ void main() {
});
test('reorder no-ops on non-reorderable entries', () {
final c = MultitabController<String>(initial: [
entry('p', reorderable: false),
entry('a'),
]);
final c = MultitabController<String>(initial: [entry('p', reorderable: false), entry('a')]);
c.reorder('p', 1);
expect(c.entries.map((e) => e.id), ['p', 'a']);
});
test('reorder cannot move a tab past a pinned barrier', () {
final c = MultitabController<String>(initial: [
entry('p', reorderable: false),
entry('a'),
entry('b'),
]);
final c = MultitabController<String>(initial: [entry('p', reorderable: false), entry('a'), entry('b')]);
// 'a' tries to land at index 0 — blocked by pinned 'p'.
c.reorder('a', 0);
expect(c.entries.map((e) => e.id), ['p', 'a', 'b']);
});
test('reorder respects barriers on the right', () {
final c = MultitabController<String>(initial: [
entry('a'),
entry('b'),
entry('p', reorderable: false),
]);
final c = MultitabController<String>(initial: [entry('a'), entry('b'), entry('p', reorderable: false)]);
// 'a' tries to land past pinned 'p' — clamped to before it.
c.reorder('a', 2);
expect(c.entries.map((e) => e.id), ['b', 'a', 'p']);
@@ -146,10 +129,7 @@ void main() {
test('replace rejects id changes', () {
final c = MultitabController<String>(initial: [entry('a')]);
expect(
() => c.replace('a', MultitabEntry<String>(id: 'b', title: 'b', payload: 'b')),
throwsStateError,
);
expect(() => c.replace('a', MultitabEntry<String>(id: 'b', title: 'b', payload: 'b')), throwsStateError);
});
test('notifies listeners on every mutation', () {