convert_config.dart 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import 'package:ConversionFlutterDemo/models/convert_contain_options_bean.dart';
  2. import 'package:ConversionFlutterDemo/models/convert_type.dart';
  3. import 'package:ConversionFlutterDemo/states/convert_options_provider.dart';
  4. import 'package:ConversionFlutterDemo/widgets/options/convert_csv_options_widget.dart';
  5. import 'package:ConversionFlutterDemo/widgets/options/convert_excel_options_widget.dart';
  6. import 'package:ConversionFlutterDemo/widgets/options/convert_html_options_widget.dart';
  7. import 'package:ConversionFlutterDemo/widgets/options/convert_image_options_widget.dart';
  8. import 'package:ConversionFlutterDemo/widgets/options/convert_ppt_options_widget.dart';
  9. import 'package:ConversionFlutterDemo/widgets/options/convert_ref_options_widget.dart';
  10. import 'package:ConversionFlutterDemo/widgets/options/convert_word_options_widget.dart';
  11. import 'package:file_picker/file_picker.dart';
  12. import 'package:flutter/material.dart';
  13. import 'package:permission_handler/permission_handler.dart';
  14. import 'package:provider/provider.dart';
  15. import '../states/convert_provider.dart';
  16. class ConvertConfigWidget extends StatefulWidget {
  17. const ConvertConfigWidget({Key? key}) : super(key: key);
  18. @override
  19. State<ConvertConfigWidget> createState() => _ConvertConfigWidgetState();
  20. }
  21. class _ConvertConfigWidgetState extends State<ConvertConfigWidget> {
  22. @override
  23. Widget build(BuildContext context) {
  24. return Column(
  25. children: [
  26. Row(
  27. children: [
  28. const Text('ConvertType:'),
  29. Consumer<ConvertOptionsProvider>(
  30. builder: (context, optionsProvider, child) {
  31. return Expanded(
  32. child: TextButton(
  33. child: Text(
  34. optionsProvider.convertType == ConvertType.none
  35. ? 'Please click to select a conversion type'
  36. : optionsProvider.convertType.name,
  37. style: const TextStyle(fontSize: 12),
  38. ),
  39. onPressed: () async {
  40. _selectConvertType(context);
  41. },
  42. ));
  43. }),
  44. IconButton(
  45. onPressed: () {
  46. ConvertType convertType =
  47. context.read<ConvertOptionsProvider>().convertType;
  48. _showConvertOptionsModalBottomSheet(context, convertType);
  49. },
  50. icon: const Icon(Icons.settings))
  51. ],
  52. ),
  53. SizedBox(
  54. width: double.infinity,
  55. child: ElevatedButton(
  56. onPressed: () {
  57. ConvertType convertType =
  58. context.read<ConvertOptionsProvider>().convertType;
  59. if (convertType != ConvertType.none) {
  60. getPDFFileList(context);
  61. }
  62. },
  63. child: const Text('Convert')))
  64. ],
  65. );
  66. }
  67. ///request storage permission
  68. Future<bool> getPermission() async {
  69. var status = await Permission.storage.request();
  70. return status.isGranted;
  71. }
  72. ///Select pdf files from android\ios using 'file_picker'
  73. void getPDFFileList(BuildContext context) async {
  74. bool isGranted = await getPermission();
  75. if (!isGranted) {
  76. return;
  77. }
  78. FilePickerResult? result =
  79. await FilePicker.platform.pickFiles(allowMultiple: true);
  80. if (result != null) {
  81. List<String?> files = result.paths;
  82. ConvertOptionsBean options =
  83. context.read<ConvertOptionsProvider>().getOptions();
  84. ConvertType convertType =
  85. context.read<ConvertOptionsProvider>().convertType;
  86. context
  87. .read<ConvertProvider>()
  88. .addConvertData(context, convertType, options, files);
  89. } else {}
  90. }
  91. void _showConvertOptionsModalBottomSheet(context, ConvertType convertType) {
  92. showModalBottomSheet<int>(
  93. context: context,
  94. isScrollControlled: false,
  95. builder: (BuildContext context) {
  96. switch (convertType) {
  97. case ConvertType.ppt:
  98. return const ConvertPPTOptionsWidget();
  99. case ConvertType.word:
  100. return const ConvertWordOptionsWidget();
  101. case ConvertType.excel:
  102. return const ConvertExcelOptionsWidget();
  103. case ConvertType.image:
  104. return const ConvertImageOptionsWidget();
  105. case ConvertType.csv:
  106. return const ConvertCSVOptionsWidget();
  107. case ConvertType.rtf:
  108. return const ConvertRTFOptionsWidget();
  109. case ConvertType.html:
  110. return const ConvertHtmlOptionsWidget();
  111. default:
  112. return const Padding(
  113. padding: EdgeInsets.all(16),
  114. child: Text('Options not support'));
  115. }
  116. });
  117. }
  118. /// show support convert mime type
  119. void _selectConvertType(context) {
  120. List<ConvertType> convertList = [
  121. ConvertType.ppt,
  122. ConvertType.word,
  123. ConvertType.excel,
  124. ConvertType.txt,
  125. ConvertType.image,
  126. ConvertType.csv,
  127. ConvertType.rtf,
  128. ConvertType.html
  129. ];
  130. showModalBottomSheet(
  131. context: context,
  132. builder: (BuildContext context) {
  133. return ListView.builder(
  134. itemCount: convertList.length,
  135. itemBuilder: (BuildContext context, int index) {
  136. ConvertType type = convertList[index];
  137. return ListTile(
  138. title: Text(type.name),
  139. onTap: () {
  140. context
  141. .read<ConvertOptionsProvider>()
  142. .changeConvertType(type);
  143. Navigator.of(context).pop();
  144. },
  145. );
  146. });
  147. });
  148. }
  149. }