From 65d5e9777d6ec637ebc887831efd2e80411a16bf Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Mon, 21 Mar 2022 10:49:08 -0700 Subject: [PATCH] Fix: 344 - Folder Selection on Settings can be Opened Multiple times --- lib/controllers/filesharing.dart | 14 +++++++++++ lib/widgets/folderpicker.dart | 41 ++++++++++++++++---------------- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/lib/controllers/filesharing.dart b/lib/controllers/filesharing.dart index 49da9bdf..136fd784 100644 --- a/lib/controllers/filesharing.dart +++ b/lib/controllers/filesharing.dart @@ -42,3 +42,17 @@ Future showCreateFilePicker(BuildContext ctx) async { appstate.disableFilePicker = false; return result; } + +Future showSelectDirectoryPicker(BuildContext ctx) async { + // only allow one file picker at a time + // note: ideally we would destroy file picker when leaving a conversation + // but we don't currently have that option. + // we need to store AppState in a variable because ctx might be destroyed + // while awaiting for pickFiles. + var appstate = Provider.of(ctx, listen: false); + appstate.disableFilePicker = true; + // currently lockParentWindow only works on Windows... + String? result = await FilePicker.platform.getDirectoryPath(lockParentWindow: true); + appstate.disableFilePicker = false; + return result; +} diff --git a/lib/widgets/folderpicker.dart b/lib/widgets/folderpicker.dart index 2b1f586e..52c5cb67 100644 --- a/lib/widgets/folderpicker.dart +++ b/lib/widgets/folderpicker.dart @@ -1,4 +1,7 @@ +import 'package:cwtch/config.dart'; +import 'package:cwtch/controllers/filesharing.dart'; import 'package:cwtch/cwtch_icons_icons.dart'; +import 'package:cwtch/models/appstate.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'dart:io'; @@ -43,27 +46,25 @@ class _CwtchFolderPickerState extends State { testKey: widget.testKey, controller: ctrlrVal, readonly: Platform.isAndroid, - onPressed: () async { - if (Platform.isAndroid) { - return; - } + onPressed: Provider.of(context).disableFilePicker + ? null + : () async { + if (Platform.isAndroid) { + return; + } - try { - var selectedDirectory = await getDirectoryPath(); - if (selectedDirectory != null) { - //File directory = File(selectedDirectory); - selectedDirectory += "/"; - ctrlrVal.text = selectedDirectory; - if (widget.onSave != null) { - widget.onSave!(selectedDirectory); - } - } else { - // User canceled the picker - } - } catch (e) { - print(e); - } - }, + var selectedDirectory = await showSelectDirectoryPicker(context); + if (selectedDirectory != null) { + //File directory = File(selectedDirectory); + selectedDirectory += "/"; + ctrlrVal.text = selectedDirectory; + if (widget.onSave != null) { + widget.onSave!(selectedDirectory); + } + } else { + // User canceled the picker + } + }, onChanged: widget.onSave, icon: Icon(Icons.folder), tooltip: widget.tooltip,