Я создаю клиент для веб-сайта, где пользователи могут оставлять комментарии в виде дерева.В настоящее время я использую следующее для отображения панели загрузки, пока комментарии не будут загружены.
FutureBuilder(
future: fetchComments(this.storyId),
builder: (BuildContext context, AsyncSnapshot snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.active:
case ConnectionState.waiting:
return LinearProgressIndicator();
case ConnectionState.done:
if (snapshot.hasError) {
final MissingRequiredKeysException myError = snapshot.error;
return Text('Error: ${myError.missingKeys}');
} else {
final api.Comment comment = snapshot.data;
return Expanded(child: Comment(comment.comments));
}
}
}
)
Это работает довольно хорошо, когда есть около 200 комментариев, но когда их больше, загрузкабар "зависает" в течение заметного промежутка времени.
Я предполагаю, что создание виджета Comment
занимает значительное время, поскольку его можно глубоко вкладывать.
Чтобы избежать зависанияВ главном потоке я изменил свой код для создания виджета внутри Isolate
:
FutureBuilder(
future: compute<int, Widget>(
buildComments, this.storyId),
builder: (BuildContext context, AsyncSnapshot snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.active:
case ConnectionState.waiting:
return LinearProgressIndicator();
case ConnectionState.done:
if (snapshot.hasError) {
final ArgumentError myError = snapshot.error;
return Text('Error: ${myError.message}');
} else {
final Widget comments = snapshot.data;
return comments;
}
}
},
)
Но это еще медленнее, пользовательский интерфейс блокируется вдвое больше времени.Я подозреваю , что это может быть вызвано передачей данных между изолятом и главным изолятом (что может произойти в главном потоке).
Что было бы хорошим способом решить эту зависаниеПроблема?
Я бы хотел сделать ее максимально прозрачной для пользователя (без анимации загрузки при прокрутке списка).