如何从接口设置状态



我有一个实现接口的类

class _UserSignupInterface implements UserSignupInterface {
  @override
  void onSuccess() {
  }
  @override
  void onError(String message) {
  }
}

但是,我无法通过 setState(( 更改变量,我将使用它来更改页面上显示的文本。

我试图将接口扩展到我的_SignupSelectUsernamePageState并在接口内调用更改状态,但它只会导致错误,也许不应该在接口中调用 setState((。

我还尝试将变量放置在StatefulWidgetPageState之外。但是,如果我不能在界面中使用 setState((,简单地更新其值没有任何意义,因为它不反映页面上文本的更改。

该接口是我用于处理从网络请求接收的响应数据的回调。

StatefulWidgetPageState(扩展该 StatefulWidget(之外更改 Text Widget 文本的正确方法是什么?因为我必须在接口内处理数据处理和更新变量。

我认为

setState应该只在小部件本身中调用。

颤振中,谷歌在短暂和应用状态之间做出了区别

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

由于您希望登录是全局的,因此您需要应用程序状态。

有很多方法可以管理它 - https://flutter.dev/docs/development/data-and-backend/state-mgmt/options

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

范围模型 - 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)
},

您的选择。

最新更新