Как установить состояние из интерфейса? - PullRequest
0 голосов
/ 03 апреля 2019

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

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

  }

  @override
  void onError(String message) {
  }
}

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

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

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

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

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

1 Ответ

0 голосов
/ 03 апреля 2019

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

В трепетании Google делает различие между Ephemeral и App State

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

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

Существует множество способов управления им - https://flutter.dev/docs/development/data-and-backend/state-mgmt/options

Redux - https://pub.dartlang.org/packages/flutter_redux

Scope Model- https://pub.dartlang.org/packages/scoped_model

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

Mobx - 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)
},

На ваш выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...