Медленно ли считывать данные из файла json с помощью rootBundle.LoadString?

#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