#flutter #graphql #flutter-web #flutter-graphql
Вопрос:
У меня проблема с flutter GraphQL при использовании подписок. Я использую веб-серверную часть для flutter, и всякий раз, когда размер представления изменяется, это приводит к отмене и изменению подписки, что приводит к рассылке спама на мой сервер с запросами.
Это имеет смысл, потому что изменение размера представления заставляет flutter заново создавать виджет, а виджет включает подписку GraphQL.
Поэтому я знаю, что моя проблема-это проблема архитектуры кода, а не проблема флаттера. Однако все примеры использования GraphQL с flutter, которые я нашел в Интернете, следуют точно такому же шаблону. Я не уверен, как организовать свой код, чтобы подписка на GraphQL была «вне» представления, когда подписка на выполнение зависит от того, какое представление отображается.
Есть какие-нибудь идеи о том, как я должен организовать свой код?
Спасибо за помощь!
Это моя текущая структура для представления моих данных и извлечения информации из GraphQL.
class PersonWidget extends StatelessWidget {
PersonWidget({required this.personId});
Widget build(BuildContext context) {
return Subscription(
options: SubscriptionOptions(
document: gql(r'''
subscription ($personId: Int!){
person(where: {id: {_eq: $personId}}) {
id
first_name
last_name
email
}
}
}
'''),
variables: <String, String>{
'personId': personId.toString(),
},
),
builder: (result) {
if (result.isLoading amp;amp; result.data == null) {
return const Center(
child: CircularProgressIndicator(),
);
}
var person = result.data!['person'][0];
return WidgetStructureGoesHere( ... );
},
);
}
}
Комментарии:
1. Не могли бы вы попробовать использовать а
StatefulWidget
вместо аStatelessWidget
? Любопытно, может ли это сработать здесь2. @kounex Это должно быть так! Я работаю над этим сейчас, если я извлеку подписку graphql в состояние виджета, то теоретически состояние будет отделено от повторного отображения виджета. Спасибо!
3. Да, это то, на что я надеялся! Пожалуйста, дайте мне знать, если вам наконец удалось заставить его работать! 🙂