У меня есть класс, реализующий интерфейс
class _UserSignupInterface implements UserSignupInterface {
@override
void onSuccess() {
}
@override
void onError(String message) {
}
}
Однако у меня нет возможности изменить переменную с помощью setState(), которую я буду использовать для изменения отображаемого текста на моей странице.
Я попытался расширить интерфейс до моего _SignupSelectUsernamePageState и вызвать состояние изменения внутри интерфейса, но это приводит только к ошибке, возможно, setState() не следует вызывать в интерфейсе.
Я также попытался поместить переменную вне StatefulWidget и PageState. Но простое обновление его значения ничего не значит, если я не могу использовать setState() внутри интерфейса, поскольку это не отражает изменение текста на странице.
Интерфейс представляет собой обратный вызов, который я использую для обработки данных ответа, полученных от сетевых запросов.
Каков правильный способ изменения текста виджета Text за пределами StatefulWidget и PageState (который расширяет этот StatefulWidget)? Так как мне приходится заниматься обработкой данных и обновлением переменных внутри интерфейса.





Я считаю, что 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)
},
Твой выбор.