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
+47 -39
View File
@@ -17,14 +17,16 @@ void main() {
tearDown(() => f.dispose());
testWidgets('conveys its status while its contribution is focused, clears on blur', (tester) async {
await tester.pumpWidget(harness(
f,
const ClidePane(
contributionId: 'pane.x',
statusWidget: Text('S', textDirection: TextDirection.ltr),
child: SizedBox(),
await tester.pumpWidget(
harness(
f,
const ClidePane(
contributionId: 'pane.x',
statusWidget: Text('S', textDirection: TextDirection.ltr),
child: SizedBox(),
),
),
));
);
final focus = f.services.focus;
expect(focus.activeStatusWidget, isNull); // not focused yet
@@ -43,34 +45,38 @@ void main() {
// mid-build ("markNeedsBuild during build"). A focus listener must be in
// the tree to reproduce it.
f.services.focus.setActive(slot: Slots.workspace, contributionId: 'pane.x');
await tester.pumpWidget(harness(
f,
const Column(
children: [
PaneContextStatusItem(),
ClidePane(
contributionId: 'pane.x',
statusWidget: Text('S', textDirection: TextDirection.ltr),
child: SizedBox(),
),
],
await tester.pumpWidget(
harness(
f,
const Column(
children: [
PaneContextStatusItem(),
ClidePane(
contributionId: 'pane.x',
statusWidget: Text('S', textDirection: TextDirection.ltr),
child: SizedBox(),
),
],
),
),
));
);
await tester.pump(); // run the deferred post-frame convey
expect(tester.takeException(), isNull);
expect(f.services.focus.activeStatusWidget, isA<Text>());
});
testWidgets('an inactive pane never conveys', (tester) async {
await tester.pumpWidget(harness(
f,
const ClidePane(
contributionId: 'pane.x',
active: false,
statusWidget: Text('S', textDirection: TextDirection.ltr),
child: SizedBox(),
await tester.pumpWidget(
harness(
f,
const ClidePane(
contributionId: 'pane.x',
active: false,
statusWidget: Text('S', textDirection: TextDirection.ltr),
child: SizedBox(),
),
),
));
);
f.services.focus.setActive(slot: Slots.workspace, contributionId: 'pane.x');
await tester.pump();
expect(f.services.focus.activeStatusWidget, isNull);
@@ -80,19 +86,21 @@ void main() {
f.services.focus.setActive(slot: Slots.workspace, contributionId: 'pane.x');
var label = 'A';
late StateSetter setLabel;
await tester.pumpWidget(harness(
f,
StatefulBuilder(
builder: (ctx, setState) {
setLabel = setState;
return ClidePane(
contributionId: 'pane.x',
statusWidget: Text(label, textDirection: TextDirection.ltr),
child: const SizedBox(),
);
},
await tester.pumpWidget(
harness(
f,
StatefulBuilder(
builder: (ctx, setState) {
setLabel = setState;
return ClidePane(
contributionId: 'pane.x',
statusWidget: Text(label, textDirection: TextDirection.ltr),
child: const SizedBox(),
);
},
),
),
));
);
await tester.pump();
expect((f.services.focus.activeStatusWidget! as Text).data, 'A');