#json #flutter #asynchronous #dart
#json #flutter #асинхронный #dart
Вопрос:
Мне просто интересно, относительно ли медленно считывать данные из файла asset json с использованием rootBundle.loadString
.
Я знаю, что это асинхронный процесс, и я должен его дождаться, значит ли это, что я не должен делать это слишком часто или, может быть, мне следует показывать индикатор загрузки при чтении файла? или это не так медленно?
Комментарии:
1. Вам нужно использовать FutureBuilder.
2. что, если я загружаю строку json, чтобы заполнить выпадающее меню на экране другими полями ввода? Я думаю, что могу просто загрузить строки, например, в initState()? это плохая практика?
3. это асинхронная операция, вы хотите создать пользовательский интерфейс из Future, чтобы FutureBuilder идеально подходил.
Ответ №1:
LoadString использует compute
(т. Е. запускает изоляцию) для файлов> 10 КБ (последние подробности см. В разделе Реализация функции). Я обнаружил, что изолированные устройства работают (или запускаются, не имеет значения) медленно на некоторых устройствах Android (например, Samsung J5 2017). Не уверен, почему — это медленное устройство или какие-то проблемы с многопоточным вызовом для этой архитектуры. Таким образом, вы можете просто использовать ‘rootBundle.load()’ напрямую, например:
Future<String> loadString(String key) async {
final ByteData data = await rootBundle.load(key);
return utf8.decode(data.buffer.asUint8List());
}
Ответ №2:
loadString
возвращает Future, поэтому вы можете использовать FutureBuilder для создания выпадающего списка из будущих данных.
// other code
FutureBuilder(
future: rootBundle.loadString('path-to-file.json'),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
// return a widget using snapshot's data.
}
// handle other connectionStats.
},
),
// other code