如何从界面设置状态?

Posted

技术标签:

【中文标题】如何从界面设置状态?【英文标题】:How to set state from an interface? 【发布时间】:2019-04-03 07:51:12 【问题描述】:

我有一个实现接口的类

class _UserSignupInterface implements UserSignupInterface 
  @override
  void onSuccess() 

  

  @override
  void onError(String message) 
  

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

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

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

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

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

【问题讨论】:

【参考方案1】:

我认为 setState 应该只在小部件本身内调用。

在 Flutter 中,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

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

你的选择。

【讨论】:

以上是关于如何从界面设置状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置电脑使在一段时间空闲时自动进入登陆界面?

进入阵列卡快捷键

unity3d中的GUI界面如何让一个button选中后变色。

华硕RT-N16路由器如何完全恢复到出厂状态

win10如何恢复网络设置

如何在 UIButton 中的选定状态下从正常状态和标题文本设置 UIImage