Skip to content

Commit 8b7def1

Browse files
committed
[gui] Replace StateProvider with NotifierProvider
The recommended way to update StateProviders to riverpod v3 is to create a Notifier that is provided by a NotifierProvider This also removes the dependency on legacy.dart
1 parent 3fe357a commit 8b7def1

File tree

8 files changed

+159
-40
lines changed

8 files changed

+159
-40
lines changed

src/client/gui/lib/catalogue/image_card.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class ImageCard extends ConsumerWidget {
7979
const SizedBox(width: 16),
8080
OutlinedButton(
8181
onPressed: () {
82-
ref.read(launchingImageProvider.notifier).state = image;
82+
ref.read(launchingImageProvider.notifier).set(image);
8383
Scaffold.of(context).openEndDrawer();
8484
},
8585
child: SvgPicture.asset(

src/client/gui/lib/catalogue/launch_form.dart

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import 'dart:async';
33
import 'package:basics/basics.dart';
44
import 'package:flutter/material.dart' hide Switch, ImageInfo;
55
import 'package:flutter_riverpod/flutter_riverpod.dart';
6-
import 'package:flutter_riverpod/legacy.dart';
76
import 'package:protobuf/protobuf.dart';
87
import 'package:rxdart/rxdart.dart';
98

@@ -20,7 +19,21 @@ import '../vm_details/mount_points.dart';
2019
import '../vm_details/ram_slider.dart';
2120
import '../vm_details/spec_input.dart';
2221

23-
final launchingImageProvider = StateProvider<ImageInfo>((_) => ImageInfo());
22+
class LaunchingImageNotifier extends Notifier<ImageInfo> {
23+
@override
24+
ImageInfo build() {
25+
return ImageInfo();
26+
}
27+
28+
void set(ImageInfo imageInfo) {
29+
state = imageInfo;
30+
}
31+
}
32+
33+
final launchingImageProvider =
34+
NotifierProvider<LaunchingImageNotifier, ImageInfo>(
35+
LaunchingImageNotifier.new,
36+
);
2437

2538
final randomNameProvider = Provider.autoDispose(
2639
(ref) => generatePetname(ref.watch(vmNamesProvider)),

src/client/gui/lib/extensions.dart

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,29 @@
11
import 'package:flutter/gestures.dart';
22
import 'package:flutter/material.dart';
33
import 'package:flutter_riverpod/flutter_riverpod.dart';
4-
import 'package:flutter_riverpod/legacy.dart';
54

65
import 'sidebar.dart';
76

8-
final _hoveredLinkProvider = StateProvider.autoDispose<TextSpan?>((ref) {
9-
ref.watch(sidebarKeyProvider);
10-
return null;
11-
});
7+
class HoveredLinkNotifier extends Notifier<TextSpan?> {
8+
@override
9+
TextSpan? build() {
10+
ref.watch(sidebarKeyProvider);
11+
return null;
12+
}
13+
14+
void set(TextSpan? value) {
15+
state = value;
16+
}
17+
18+
void clear() {
19+
state = null;
20+
}
21+
}
22+
23+
final _hoveredLinkProvider =
24+
NotifierProvider.autoDispose<HoveredLinkNotifier, TextSpan?>(
25+
HoveredLinkNotifier.new,
26+
);
1227

1328
extension TextSpanFromStringExt on String {
1429
TextSpan get span => TextSpan(
@@ -72,7 +87,7 @@ extension TextSpanExt on TextSpan {
7287
decorationColor: Colors.blue,
7388
),
7489
recognizer: TapGestureRecognizer()..onTap = callback,
75-
onEnter: (_) => ref.read(_hoveredLinkProvider.notifier).state = this,
90+
onEnter: (_) => ref.read(_hoveredLinkProvider.notifier).set(this),
7691
onExit: (_) {
7792
if (ref.context.mounted) ref.invalidate(_hoveredLinkProvider);
7893
},

src/client/gui/lib/sidebar.dart

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import 'dart:async';
33
import 'package:basics/basics.dart';
44
import 'package:flutter/material.dart';
55
import 'package:flutter_riverpod/flutter_riverpod.dart';
6-
import 'package:flutter_riverpod/legacy.dart';
76
import 'package:flutter_svg/flutter_svg.dart';
87

98
import 'catalogue/catalogue.dart';
@@ -31,7 +30,7 @@ class SidebarKeyNotifier extends Notifier<String> {
3130

3231
void set(String key) {
3332
if (key.sidebarVmName != null) {
34-
ref.read(vmVisitedProvider(key).notifier).state = true;
33+
ref.read(vmVisitedProvider(key).notifier).setVisited();
3534
}
3635
state = key;
3736
}
@@ -41,9 +40,55 @@ final sidebarKeyProvider = NotifierProvider<SidebarKeyNotifier, String>(
4140
SidebarKeyNotifier.new,
4241
);
4342

44-
final vmVisitedProvider = StateProvider.family<bool, String>((_, __) => false);
45-
final sidebarExpandedProvider = StateProvider((_) => false);
46-
final sidebarPushContentProvider = StateProvider((_) => false);
43+
class VmVisitedNotifier extends Notifier<bool> {
44+
VmVisitedNotifier(this.arg);
45+
final String arg;
46+
47+
@override
48+
bool build() {
49+
return false;
50+
}
51+
52+
void setVisited() {
53+
state = true;
54+
}
55+
}
56+
57+
final vmVisitedProvider =
58+
NotifierProvider.family<VmVisitedNotifier, bool, String>(
59+
VmVisitedNotifier.new,
60+
);
61+
62+
class SidebarExpandedNotifier extends Notifier<bool> {
63+
@override
64+
bool build() {
65+
return false;
66+
}
67+
68+
void setExpanded(bool value) {
69+
state = value;
70+
}
71+
}
72+
73+
final sidebarExpandedProvider = NotifierProvider<SidebarExpandedNotifier, bool>(
74+
SidebarExpandedNotifier.new,
75+
);
76+
77+
class SidebarPushContentNotifier extends Notifier<bool> {
78+
@override
79+
bool build() {
80+
return false;
81+
}
82+
83+
void setPushContent(bool value) {
84+
state = value;
85+
}
86+
}
87+
88+
final sidebarPushContentProvider =
89+
NotifierProvider<SidebarPushContentNotifier, bool>(
90+
SidebarPushContentNotifier.new,
91+
);
4792
Timer? sidebarExpandTimer;
4893

4994
class SideBar extends ConsumerWidget {
@@ -113,7 +158,7 @@ class SideBar extends ConsumerWidget {
113158
),
114159
onPressed: () => ref
115160
.read(sidebarPushContentProvider.notifier)
116-
.update((state) => !state),
161+
.setPushContent(!pushContent),
117162
),
118163
);
119164

@@ -169,13 +214,13 @@ class SideBar extends ConsumerWidget {
169214
if (pushContent) return;
170215
sidebarExpandTimer?.cancel();
171216
sidebarExpandTimer = Timer(const Duration(milliseconds: 200), () {
172-
ref.read(sidebarExpandedProvider.notifier).state = true;
217+
ref.read(sidebarExpandedProvider.notifier).setExpanded(true);
173218
});
174219
},
175220
onExit: (_) {
176221
if (pushContent) return;
177222
sidebarExpandTimer?.cancel();
178-
ref.read(sidebarExpandedProvider.notifier).state = false;
223+
ref.read(sidebarExpandedProvider.notifier).setExpanded(false);
179224
},
180225
child: AnimatedContainer(
181226
duration: SideBar.animationDuration,

src/client/gui/lib/vm_details/terminal.dart

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import 'package:dartssh2/dartssh2.dart';
88
import 'package:flutter/material.dart';
99
import 'package:flutter/services.dart';
1010
import 'package:flutter_riverpod/flutter_riverpod.dart';
11-
import 'package:flutter_riverpod/legacy.dart';
1211
import 'package:flutter_svg/flutter_svg.dart';
1312
import 'package:synchronized/synchronized.dart';
1413
import 'package:xterm/xterm.dart';
@@ -19,12 +18,28 @@ import '../platform/platform.dart';
1918
import '../providers.dart';
2019
import '../vm_action.dart';
2120

22-
final runningShellsProvider = StateProvider.autoDispose.family<int, String>((
23-
_,
24-
__,
25-
) {
26-
return 0;
27-
});
21+
class RunningShellsNotifier extends Notifier<int> {
22+
RunningShellsNotifier(this.arg);
23+
final String arg;
24+
25+
@override
26+
int build() {
27+
return 0;
28+
}
29+
30+
void increment() {
31+
state = state + 1;
32+
}
33+
34+
void decrement() {
35+
state = state - 1;
36+
}
37+
}
38+
39+
final runningShellsProvider =
40+
NotifierProvider.autoDispose.family<RunningShellsNotifier, int, String>(
41+
RunningShellsNotifier.new,
42+
);
2843

2944
class ShellId {
3045
final int id;
@@ -123,9 +138,7 @@ class TerminalNotifier extends Notifier<Terminal?> {
123138
errorsAreFatal: true,
124139
);
125140

126-
ref.read(runningShellsProvider(arg.vmName).notifier).update((state) {
127-
return state + 1;
128-
});
141+
ref.read(runningShellsProvider(arg.vmName).notifier).increment();
129142
return terminal;
130143
}
131144

@@ -141,9 +154,7 @@ class TerminalNotifier extends Notifier<Terminal?> {
141154
void _dispose() {
142155
isolate?.kill(priority: Isolate.immediate);
143156
if (isolate != null) {
144-
ref
145-
.read(runningShellsProvider(arg.vmName).notifier)
146-
.update((state) => state - 1);
157+
ref.read(runningShellsProvider(arg.vmName).notifier).decrement();
147158
}
148159
isolate = null;
149160
}

src/client/gui/lib/vm_table/header_selection.dart

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
import 'package:built_collection/built_collection.dart';
22
import 'package:flutter/material.dart';
33
import 'package:flutter_riverpod/flutter_riverpod.dart';
4-
import 'package:flutter_riverpod/legacy.dart';
54
import 'package:flutter_svg/flutter_svg.dart';
65

76
import 'vm_table_headers.dart';
87

9-
final enabledHeadersProvider = StateProvider(
10-
(_) => {for (final h in headers) h.name: true}.build(),
8+
class EnabledHeadersNotifier extends Notifier<BuiltMap<String, bool>> {
9+
@override
10+
BuiltMap<String, bool> build() {
11+
return {for (final h in headers) h.name: true}.build();
12+
}
13+
14+
void toggleHeader(String name, bool isSelected) {
15+
state = state.rebuild((set) => set[name] = isSelected);
16+
}
17+
}
18+
19+
final enabledHeadersProvider =
20+
NotifierProvider<EnabledHeadersNotifier, BuiltMap<String, bool>>(
21+
EnabledHeadersNotifier.new,
1122
);
1223

1324
class HeaderSelectionTile extends ConsumerWidget {
@@ -25,7 +36,7 @@ class HeaderSelectionTile extends ConsumerWidget {
2536
value: enabledHeaders[name],
2637
onChanged: (isSelected) => ref
2738
.read(enabledHeadersProvider.notifier)
28-
.update((state) => state.rebuild((set) => set[name] = isSelected!)),
39+
.toggleHeader(name, isSelected!),
2940
);
3041
}
3142
}

src/client/gui/lib/vm_table/search_box.dart

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_riverpod/flutter_riverpod.dart';
3-
import 'package:flutter_riverpod/legacy.dart';
43

5-
final searchNameProvider = StateProvider((_) => '');
4+
class SearchNameNotifier extends Notifier<String> {
5+
@override
6+
String build() {
7+
return '';
8+
}
9+
10+
void set(String value) {
11+
state = value;
12+
}
13+
}
14+
15+
final searchNameProvider = NotifierProvider<SearchNameNotifier, String>(
16+
SearchNameNotifier.new,
17+
);
618

719
class SearchBox extends ConsumerWidget {
820
const SearchBox({super.key});
@@ -16,7 +28,7 @@ class SearchBox extends ConsumerWidget {
1628
hintText: 'Search instances...',
1729
suffixIcon: Icon(Icons.search),
1830
),
19-
onChanged: (name) => ref.read(searchNameProvider.notifier).state = name,
31+
onChanged: (name) => ref.read(searchNameProvider.notifier).set(name),
2032
),
2133
);
2234
}

src/client/gui/lib/vm_table/vms.dart

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import 'package:built_collection/built_collection.dart';
33
import 'package:collection/collection.dart';
44
import 'package:flutter/material.dart' hide Table, Switch;
55
import 'package:flutter_riverpod/flutter_riverpod.dart';
6-
import 'package:flutter_riverpod/legacy.dart';
76

87
import '../catalogue/catalogue.dart';
98
import '../providers.dart';
@@ -16,7 +15,20 @@ import 'search_box.dart';
1615
import 'table.dart';
1716
import 'vm_table_headers.dart';
1817

19-
final runningOnlyProvider = StateProvider((_) => false);
18+
class RunningOnlyNotifier extends Notifier<bool> {
19+
@override
20+
bool build() {
21+
return false;
22+
}
23+
24+
void set(bool value) {
25+
state = value;
26+
}
27+
}
28+
29+
final runningOnlyProvider = NotifierProvider<RunningOnlyNotifier, bool>(
30+
RunningOnlyNotifier.new,
31+
);
2032

2133
final selectedVmsProvider =
2234
NotifierProvider<SelectedVmsNotifier, BuiltSet<String>>(
@@ -82,7 +94,7 @@ class Vms extends ConsumerWidget {
8294
Switch(
8395
label: 'Show running instances only',
8496
value: runningOnly,
85-
onChanged: (v) => ref.read(runningOnlyProvider.notifier).state = v,
97+
onChanged: (v) => ref.read(runningOnlyProvider.notifier).set(v),
8698
),
8799
const Spacer(),
88100
const SearchBox(),

0 commit comments

Comments
 (0)