Как установить состояние из интерфейса?

У меня есть класс, реализующий интерфейс

class _UserSignupInterface implements UserSignupInterface {
  @override
  void onSuccess() {

  }

  @override
  void onError(String message) {
  }
}

Однако у меня нет возможности изменить переменную с помощью setState(), которую я буду использовать для изменения отображаемого текста на моей странице.

Я попытался расширить интерфейс до моего _SignupSelectUsernamePageState и вызвать состояние изменения внутри интерфейса, но это приводит только к ошибке, возможно, setState() не следует вызывать в интерфейсе.

Я также попытался поместить переменную вне StatefulWidget и PageState. Но простое обновление его значения ничего не значит, если я не могу использовать setState() внутри интерфейса, поскольку это не отражает изменение текста на странице.

Интерфейс представляет собой обратный вызов, который я использую для обработки данных ответа, полученных от сетевых запросов.

Каков правильный способ изменения текста виджета Text за пределами StatefulWidget и PageState (который расширяет этот StatefulWidget)? Так как мне приходится заниматься обработкой данных и обновлением переменных внутри интерфейса.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
388
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что setState следует вызывать только внутри самого виджета.

Во флаттере Google различает Ephemeral и App State.

https://flutter.dev/docs/development/data-and-backend/state-mgmt/ephemeral-vs-app

Поскольку вы хотите, чтобы ваш логин был глобальным, вам нужно состояние приложения.

Есть много способов управлять этим - https://flutter.dev/docs/development/data-and-backend/state-mgmt/options

Редукс — https://pub.dartlang.org/packages/flutter_redux

Модель масштаба — https://pub.dartlang.org/packages/scoped_model

Блок - https://felangel.github.io/bloc/#/

Мобкс — https://github.com/mobxjs/mobx.dart

Делайте все вручную.

Примеры акций — https://github.com/flutter/flutter/tree/master/examples/stocks

В ребенке это нужно.

class StockSettings extends StatefulWidget {
  const StockSettings(this.configuration, this.updater);

  final StockConfiguration configuration;
  final ValueChanged<StockConfiguration> updater;

  @override
  StockSettingsState createState() => StockSettingsState();
}

class StockSettingsState extends State<StockSettings> {
void _handleBackupChanged(bool value) {
    sendUpdates(widget.configuration.copyWith(backupMode: value ? BackupMode.enabled : BackupMode.disabled));
}

void sendUpdates(StockConfiguration value) {
    if (widget.updater != null)
      widget.updater(value);
}

В родительском элементе вы передаете средство обновления конфигурации, которое является просто оболочкой для заданного состояния.

class StocksAppState extends State<StocksApp> {
  StockData stocks;

  StockConfiguration _configuration = StockConfiguration(
    stockMode: StockMode.optimistic,
    backupMode: BackupMode.enabled,
    debugShowGrid: false,
    debugShowSizes: false,
    debugShowBaselines: false,
    debugShowLayers: false,
    debugShowPointers: false,
    debugShowRainbow: false,
    showPerformanceOverlay: false,
    showSemanticsDebugger: false
  );

  @override
  void initState() {
    super.initState();
    stocks = StockData();
  }

  void configurationUpdater(StockConfiguration value) {
    setState(() {
      _configuration = value;
    });
}

routes: <String, WidgetBuilder>{
         '/':         (BuildContext context) => StockHome(stocks, _configuration, configurationUpdater),
         '/settings': (BuildContext context) => StockSettings(_configuration, configurationUpdater)
},

Твой выбор.

Другие вопросы по теме