Не получается создать по отдельности папку и файл
main_page.dart
import '../storage.dart'
class MainPage extends StatefulWidget {
@override
_MainPageState createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
@override
void initState() {
super.initState();
// _createListsFolder('tempList');
// _createListFile('words');
_createFile('tempList', 'words');
}
...
...
Future<void> _createListsFolder(String folderName) async {
await storage.createListsFolder(folderName);
}
Future<void> _createListFile(String fileName) async {
await storage.createListFile(fileName);
}
Future<void> _createFile(String folderName, String fileName) async {
await _createListsFolder(folderName);
await _createListFile(fileName);
}
...
...
}
first_page.dart
import '../storage.dart'
class OpenCards extends StatefulWidget {
@override
_OpenCardsState createState() => _OpenCardsState();
}
class _OpenCardsState extends State<OpenCards> {
...
...
@override
void dispose() {
_writeData(_words);
super.dispose();
}
Future<void> _writeData(List<List<dynamic>> data) async {
await storage.writeData(data);
}
...
...
}
storage.dart
final Storage storage = Storage();
class Storage {
String listFolder;
String listFile;
...
...
Future<String> get localPathDBs async {
final directory = await getExternalStorageDirectory();
return directory.path;
}
Future<String> createListsFolder(String folderName) async {
final _localPathDBs = await localPathDBs;
Directory listsFolderPath =
await Directory('$_localPathDBs/$folderName').create();
return listFolder = listsFolderPath.path;
}
Future<String> createListFile(String fileName) async {
File listsFilePath =
await File('$listFolder/$fileName').create(recursive: true);
return listFile = listsFilePath.path;
}
Future<void> writeData(List<List<dynamic>> data) async {
await File(listFile).writeAsString(data, mode: FileMode.write);
}
...
...
}
В файле main_page.dart создаю сразу папку и файл. В файле first_page.dart при закрытии страницы сохраняю данные в созданный файл. Программа создает/сохраняет, но у меня два вопроса. Правильно ли сделал, что создал экземпляр storage в файле storage.dart и через него создавал директорию/файл и сохранял данные. Или это не так делается? И второй вопрос. При создании файла мне приходится работать через метод _createFile. То есть, в параметрах передавать и имя директории и файла. По одельности (сначала создать директорию, затем файл - закоментированные строки в main_page.dart) не получается. Вот такая инфа в консоли отладки: I/flutter ( 5560): ===== directory: /storage/emulated/0/Android/data/com.example.eng_translator/files/tempListsDict1 E/flutter ( 5560): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: FileSystemException: Creation failed, path = 'null' (OS Error: Read-only file system, errno = 30). Наверное, это связано с Future. Решить эту проблему не смог. Только так, как сделал. Возможно ли отдельно создать папку и файл?
Ответы (1 шт):
Перенос ответа из комментариев, чтобы закрыть вопрос.
Делать глобальный инстанс не очень хорошо, как в плане оптимизации, так и в плане написания хорошего кода. Его следует создавать внутри класса где он используется. Либо если вам нужен единственный объект, использовать singleton, ioc или service locator.
Из-за асинхронности, у вас файл начинает создаваться быстрее папки. В initState async использовать нельзя, по этому остается использовать только then() у Future. Либо отделять логику от ui (Bloc, Redux, MobX)