Skip to content

Commit 792038d

Browse files
ChenDoXiuChenDoXiu
authored andcommitted
refactor: DriverSelect use callback
1 parent 6c9bd41 commit 792038d

File tree

7 files changed

+153
-158
lines changed

7 files changed

+153
-158
lines changed

lib/pages/drive/drive_page.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class DrivePage extends HookConsumerWidget {
99
@override
1010
Widget build(BuildContext context, WidgetRef ref) {
1111
return const Scaffold(
12-
body: DriverList(id: ''),
12+
body: DriverList(),
1313
);
1414
}
1515
}

lib/pages/settings/profile/profile.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:moekey/widgets/mk_image.dart';
66
import 'package:moekey/widgets/mk_input.dart';
77
import 'package:moekey/widgets/mk_scaffold.dart';
88

9+
import '../../../apis/models/drive.dart';
910
import '../../../status/me_detailed.dart';
1011
import '../../../widgets/driver/driver_select_dialog/driver_select_dialog.dart';
1112

@@ -150,8 +151,8 @@ class _ProfileMemberCard extends HookConsumerWidget {
150151
),
151152
);
152153
},
153-
id: '',
154154
maxSelect: 1,
155+
selectCallback: (List<DriveFileModel> files) {},
155156
),
156157
),
157158
Positioned(

lib/widgets/driver/driver_list.dart

Lines changed: 87 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,10 @@ import 'driver_select_dialog/driver_select_dialog_state.dart';
2424
import 'upload_file_dialog.dart';
2525

2626
class DriverList extends HookConsumerWidget {
27-
const DriverList(
28-
{super.key,
29-
this.selectModel = false,
30-
this.maxSelect = 16,
31-
required this.id});
27+
const DriverList({super.key, this.selectModel = false, this.maxSelect});
3228

3329
final bool selectModel;
34-
final int maxSelect;
35-
final String id;
30+
final int? maxSelect;
3631

3732
ContextMenuCard getContextMenu(BuildContext context, ThemeColorModel themes,
3833
WidgetRef ref, bool isOriginal, void Function(bool value) setIsOriginal) {
@@ -337,21 +332,22 @@ class DriverList extends HookConsumerWidget {
337332
HookConsumer buildDriverListItem(DriveModel driverModel) {
338333
return HookConsumer(
339334
builder: (context, ref, child) {
340-
var selectList = ref.watch(driverSelectDialogStateProvider(this.id));
335+
var selectList = ref.watch(driverSelectDialogStateProvider);
341336
var id = driverModel.id;
342337
var isSelect = useState(selectList.containsKey(id));
343338
if (selectModel) {
344339
return GestureDetector(
345340
onTap: () {
346341
// if (selectList.length >= maxSelect) return;
347-
var notifier =
348-
ref.read(driverSelectDialogStateProvider(this.id).notifier);
342+
var notifier = ref.read(driverSelectDialogStateProvider.notifier);
349343
if (driverModel is DriveFileModel) {
350344
if (isSelect.value) {
351345
notifier.remove(id);
352346
isSelect.value = false;
353347
} else {
354-
if (selectList.length >= maxSelect) return;
348+
if (maxSelect != null && selectList.length >= maxSelect!) {
349+
return;
350+
}
355351
notifier.add(id, driverModel);
356352
isSelect.value = true;
357353
}
@@ -363,8 +359,8 @@ class DriverList extends HookConsumerWidget {
363359
isSelect: isSelect.value,
364360
onRemove: () {
365361
if (isSelect.value) {
366-
var notifier = ref
367-
.read(driverSelectDialogStateProvider(this.id).notifier);
362+
var notifier =
363+
ref.read(driverSelectDialogStateProvider.notifier);
368364
notifier.remove(id);
369365
isSelect.value = false;
370366
}
@@ -388,85 +384,93 @@ class DriverList extends HookConsumerWidget {
388384
AsyncValue<List<dynamic>> data,
389385
BuildContext context,
390386
ValueNotifier<bool> isOriginal) {
391-
return HookConsumer(builder: (context, ref, child) {
392-
var selectList = ref.watch(driverSelectDialogStateProvider(id));
393-
return Row(
394-
children: [
395-
const SizedBox(
396-
width: 16,
397-
),
398-
Icon(
399-
TablerIcons.cloud,
400-
size: 16,
401-
color: themes.fgColor,
402-
),
403-
const SizedBox(
404-
width: 4,
405-
),
406-
for (var (index, item) in path.indexed) ...[
407-
if (index != 0) ...[
408-
const Icon(
409-
TablerIcons.chevron_right,
410-
size: 16,
411-
),
387+
return HookConsumer(
388+
builder: (context, ref, child) {
389+
var selectList = ref.watch(driverSelectDialogStateProvider);
390+
return Row(
391+
children: [
392+
const SizedBox(
393+
width: 16,
394+
),
395+
Icon(
396+
TablerIcons.cloud,
397+
size: 16,
398+
color: themes.fgColor,
399+
),
400+
const SizedBox(
401+
width: 4,
402+
),
403+
for (var (index, item) in path.indexed) ...[
404+
if (index != 0) ...[
405+
const Icon(
406+
TablerIcons.chevron_right,
407+
size: 16,
408+
),
409+
const SizedBox(
410+
width: 4,
411+
),
412+
],
413+
HoverBuilder(builder: (context, isHover) {
414+
return GestureDetector(
415+
onTap: () {
416+
if (index == path.length - 1) return;
417+
ref.read(drivePathProvider.notifier).backAt(index: index);
418+
},
419+
child: Text(
420+
item["name"],
421+
style: TextStyle(
422+
decoration: index != path.length - 1 && isHover
423+
? TextDecoration.underline
424+
: null,
425+
fontWeight:
426+
index == path.length - 1 ? FontWeight.bold : null),
427+
),
428+
);
429+
}),
412430
const SizedBox(
413431
width: 4,
414432
),
415433
],
416-
HoverBuilder(builder: (context, isHover) {
417-
return GestureDetector(
418-
onTap: () {
419-
if (index == path.length - 1) return;
420-
ref.read(drivePathProvider.notifier).backAt(index: index);
434+
const Spacer(),
435+
if (selectModel)
436+
TextButton(
437+
onPressed: () {
438+
var selectListCopy = selectList.values.toList();
439+
ref.read(driverSelectDialogStateProvider.notifier).clear();
440+
Navigator.of(context).pop(selectListCopy);
421441
},
422442
child: Text(
423-
item["name"],
424-
style: TextStyle(
425-
decoration: index != path.length - 1 && isHover
426-
? TextDecoration.underline
427-
: null,
428-
fontWeight:
429-
index == path.length - 1 ? FontWeight.bold : null),
443+
maxSelect != null
444+
? S.current
445+
.confirmSelection(selectList.length, maxSelect!)
446+
: S.current.ok,
430447
),
431-
);
432-
}),
448+
),
449+
if (data.isLoading)
450+
const LoadingCircularProgress(
451+
size: 18,
452+
strokeWidth: 3,
453+
)
454+
else
455+
ContextMenuBuilder(
456+
menu: getContextMenu(context, themes, ref, isOriginal.value,
457+
(value) {
458+
isOriginal.value = value;
459+
}),
460+
mode: const [
461+
ContextMenuMode.onTap,
462+
ContextMenuMode.onSecondaryTap
463+
],
464+
child: const Icon(
465+
TablerIcons.dots,
466+
size: 18,
467+
)),
433468
const SizedBox(
434-
width: 4,
469+
width: 16,
435470
),
436471
],
437-
const Spacer(),
438-
if (selectModel)
439-
TextButton(
440-
onPressed: () {
441-
Navigator.of(context).pop();
442-
},
443-
child: Text(
444-
S.current.confirmSelection(selectList.length, maxSelect)),
445-
),
446-
if (data.isLoading)
447-
const LoadingCircularProgress(
448-
size: 18,
449-
strokeWidth: 3,
450-
)
451-
else
452-
ContextMenuBuilder(
453-
menu: getContextMenu(context, themes, ref, isOriginal.value,
454-
(value) {
455-
isOriginal.value = value;
456-
}),
457-
mode: const [
458-
ContextMenuMode.onTap,
459-
ContextMenuMode.onSecondaryTap
460-
],
461-
child: const Icon(
462-
TablerIcons.dots,
463-
size: 18,
464-
)),
465-
const SizedBox(
466-
width: 16,
467-
),
468-
],
469-
);
470-
});
472+
);
473+
},
474+
);
471475
}
472476
}

lib/widgets/driver/driver_select_dialog/driver_select_dialog.dart

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ import 'package:flutter/material.dart';
44
import 'package:flutter_hooks/flutter_hooks.dart';
55
import 'package:flutter_tabler_icons/flutter_tabler_icons.dart';
66
import 'package:hooks_riverpod/hooks_riverpod.dart';
7+
import 'package:moekey/apis/models/drive.dart';
78
import 'package:moekey/widgets/context_menu.dart';
8-
import 'package:moekey/widgets/driver/driver_select_dialog/driver_select_dialog_state.dart';
99
import 'package:moekey/widgets/driver/upload_file_dialog.dart';
1010

1111
import '../../../generated/l10n.dart';
12-
import '../../../logger.dart';
1312
import '../../mk_card.dart';
1413
import '../../mk_switch.dart';
1514
import '../driver_list.dart';
@@ -18,13 +17,13 @@ class DriverSelectContextMenu extends HookConsumerWidget {
1817
const DriverSelectContextMenu({
1918
super.key,
2019
required this.builder,
21-
required this.id,
22-
this.maxSelect = 16,
20+
this.maxSelect,
21+
required this.selectCallback,
2322
});
2423

25-
final String id;
26-
final int maxSelect;
24+
final int? maxSelect;
2725
final Widget Function(BuildContext context, void Function() open) builder;
26+
final Function(List<DriveFileModel> files) selectCallback;
2827

2928
@override
3029
Widget build(BuildContext context, WidgetRef ref) {
@@ -69,11 +68,12 @@ class DriverSelectContextMenu extends HookConsumerWidget {
6968
child: FittedBox(
7069
fit: BoxFit.fill,
7170
child: MkSwitch(
72-
value: isOriginal1.value,
73-
onChanged: (value) {
74-
isOriginal1.value = value;
75-
// setIsOriginal(value);
76-
}),
71+
value: isOriginal1.value,
72+
onChanged: (value) {
73+
isOriginal1.value = value;
74+
// setIsOriginal(value);
75+
},
76+
),
7777
),
7878
),
7979
],
@@ -90,18 +90,13 @@ class DriverSelectContextMenu extends HookConsumerWidget {
9090
label: S.current.localUpload,
9191
icon: TablerIcons.upload,
9292
onTap: () {
93-
logger.d("本地上传");
9493
DriverUploadFileDialog.showUploadDialog(
9594
context: context,
9695
isOriginal: isOriginal.value,
9796
ref: ref)
9897
.then(
9998
(value) {
100-
for (var item in value) {
101-
ref
102-
.read(driverSelectDialogStateProvider(id).notifier)
103-
.add(item.id, item);
104-
}
99+
selectCallback(value);
105100
},
106101
);
107102
return false;
@@ -117,9 +112,13 @@ class DriverSelectContextMenu extends HookConsumerWidget {
117112
showDialog(
118113
context: context,
119114
builder: (context) {
120-
return DriverSelectDialog(id: id, maxSelect: maxSelect);
115+
return DriverSelectDialog(maxSelect: maxSelect);
121116
},
122-
);
117+
).then((value) {
118+
if (value != null) {
119+
selectCallback(value);
120+
}
121+
});
123122
},
124123
);
125124
return false;
@@ -162,12 +161,10 @@ class DriverSelectContextMenu extends HookConsumerWidget {
162161
class DriverSelectDialog extends HookConsumerWidget {
163162
const DriverSelectDialog({
164163
super.key,
165-
required this.id,
166-
this.maxSelect = 16,
164+
this.maxSelect,
167165
});
168166

169-
final String id;
170-
final int maxSelect;
167+
final int? maxSelect;
171168

172169
@override
173170
Widget build(BuildContext context, WidgetRef ref) {
@@ -208,7 +205,6 @@ class DriverSelectDialog extends HookConsumerWidget {
208205
borderRadius: borderRadius,
209206
child: DriverList(
210207
selectModel: true,
211-
id: id,
212208
maxSelect: maxSelect,
213209
),
214210
),

lib/widgets/driver/driver_select_dialog/driver_select_dialog_state.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ part 'driver_select_dialog_state.g.dart';
88
@Riverpod(keepAlive: true)
99
class DriverSelectDialogState extends _$DriverSelectDialogState {
1010
@override
11-
LinkedHashMap build(String id) {
12-
return LinkedHashMap<String, DriveModel>();
11+
LinkedHashMap build() {
12+
return LinkedHashMap<String, DriveFileModel>();
1313
}
1414

15-
add(String id, DriveModel data) {
15+
add(String id, DriveFileModel data) {
1616
state[id] = data;
1717
ref.notifyListeners();
1818
}

0 commit comments

Comments
 (0)