Skip to content

Commit 14dc1ee

Browse files
Fix #72: iOS can not pick media files (image, video) in client mode
Signed-off-by: huynguyennovem <huynguyennovem@gmail.com>
1 parent ca2dbc4 commit 14dc1ee

3 files changed

Lines changed: 107 additions & 7 deletions

File tree

lib/ui/send/file_type_chooser.dart

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:netshare/config/styles.dart';
3+
4+
class FileTypeChooser extends StatefulWidget {
5+
const FileTypeChooser({super.key, required this.onSelectedType});
6+
final Function(int) onSelectedType;
7+
8+
@override
9+
State<FileTypeChooser> createState() => _FileTypeChooserState();
10+
}
11+
12+
class _FileTypeChooserState extends State<FileTypeChooser> {
13+
int _fileType = 0;
14+
15+
@override
16+
Widget build(BuildContext context) {
17+
return Padding(
18+
padding: const EdgeInsets.all(8.0),
19+
child: Column(
20+
mainAxisSize: MainAxisSize.min,
21+
children: [
22+
const Text(
23+
'Select source',
24+
style: CommonTextStyle.textStyleNormal,
25+
),
26+
RadioListTile(
27+
title: const Row(
28+
children: [
29+
Icon(Icons.perm_media),
30+
SizedBox(width: 8.0),
31+
Text('Media'),
32+
],
33+
),
34+
value: 0,
35+
groupValue: _fileType,
36+
onChanged: (value) {
37+
setState(() {
38+
_fileType = value ?? 0;
39+
});
40+
},
41+
),
42+
RadioListTile(
43+
title: const Row(
44+
children: [
45+
Icon(Icons.file_copy_rounded),
46+
SizedBox(width: 8.0),
47+
Text('File'),
48+
],
49+
),
50+
value: 1,
51+
groupValue: _fileType,
52+
onChanged: (value) {
53+
setState(() {
54+
_fileType = value ?? 1;
55+
});
56+
},
57+
),
58+
Container(
59+
margin: const EdgeInsets.symmetric(vertical: 8.0),
60+
child: FloatingActionButton.extended(
61+
onPressed: () => widget.onSelectedType.call(_fileType),
62+
label: Text(
63+
' Select ',
64+
style: CommonTextStyle.textStyleNormal.copyWith(color: textIconButtonColor),
65+
),
66+
),
67+
),
68+
],
69+
),
70+
);
71+
}
72+
}

lib/ui/send/send_widget.dart

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:io';
2+
13
import 'package:desktop_drop/desktop_drop.dart';
24
import 'package:flutter/material.dart';
35
import 'package:file_picker/file_picker.dart';
@@ -9,6 +11,7 @@ import 'package:netshare/entity/shared_file_entity.dart';
911
import 'package:netshare/provider/file_provider.dart';
1012
import 'package:netshare/ui/common_view/empty_widget.dart';
1113
import 'package:netshare/ui/list_file/file_tile_upload.dart';
14+
import 'package:netshare/ui/send/file_type_chooser.dart';
1215
import 'package:netshare/util/extension.dart';
1316
import 'package:netshare/util/utility_functions.dart';
1417
import 'package:path/path.dart' as path;
@@ -243,15 +246,40 @@ class _SendWidgetState extends State<SendWidget> {
243246
);
244247

245248
void _pickFile() async {
246-
FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true);
249+
FileType type = FileType.any;
250+
if(Platform.isIOS) {
251+
// asking pick file or media
252+
showModalBottomSheet(
253+
showDragHandle: true,
254+
context: context,
255+
shape: const RoundedRectangleBorder(
256+
borderRadius: BorderRadius.vertical(top: Radius.circular(20))),
257+
builder: (context) =>
258+
FileTypeChooser(
259+
onSelectedType: (selectedType) {
260+
if (selectedType == 0) {
261+
type = FileType.media;
262+
}
263+
Navigator.pop(context);
264+
_processPickingFile(type);
265+
},
266+
),
267+
);
268+
} else {
269+
_processPickingFile(type);
270+
}
271+
}
272+
273+
void _processPickingFile(type) async {
274+
FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true, type: type);
247275
if (result != null) {
248276
setState(() {
249277
_pickedFiles = _pickedFiles
250-
..addAll(result.paths.where((element) => element != null).map((e) => FileUpload(e!)).toList());
278+
..addAll(result.paths.where((element) => element != null)
279+
.map((e) => FileUpload(e!))
280+
.toList());
251281
_pickedFiles = _pickedFiles.toSet().toList(); // remove duplicate files
252282
});
253-
} else {
254-
// User canceled the picker
255283
}
256284
}
257285

pubspec.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ dependencies:
3636
# The following adds the Cupertino Icons font to your application.
3737
# Use with the CupertinoIcons class for iOS style icons.
3838
cupertino_icons: ^1.0.2
39-
file_picker: ^5.1.0
39+
file_picker: ^5.3.3
4040
http: ^0.13.5
4141
equatable: ^2.0.5
4242
provider: ^6.0.3
@@ -51,12 +51,12 @@ dependencies:
5151
shelf_static: ^1.0.0
5252
mime: ^1.0.3
5353
http_parser: ^4.0.2
54-
share_plus: ^6.3.0
54+
share_plus: ^7.1.0
5555
flutter_downloader: ^1.11.1
5656
path_provider: ^2.0.11
5757
android_path_provider: ^0.3.0
5858
permission_handler: ^10.2.0
59-
device_info_plus: ^8.0.0
59+
device_info_plus: ^9.0.3
6060
uuid: ^3.0.7
6161
hive: ^2.2.3
6262
hive_flutter: ^1.1.0

0 commit comments

Comments
 (0)