Изменение размера представлений flutter с помощью вложений GraphQL приводит к спаму запросов

#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. Да, это то, на что я надеялся! Пожалуйста, дайте мне знать, если вам наконец удалось заставить его работать! 🙂