一尘不染

从StatefulWidget外部控制状态

flutter

我正在尝试了解在Widget状态之外控制StatefulWidget状态的最佳实践。

我定义了以下接口。

abstract class StartupView {
  Stream<String> get onAppSelected;

  set showActivity(bool activity);
  set message(String message);
}

我想创建一个StartupPage实现此接口的StatefulWidget 。我希望该小部件可以执行以下操作:

  1. 当按下按钮时,它将通过onAppSelected流发送事件。控制器甚至会监听此消息并执行某些操作(db调用,服务请求等)。

  2. 控制器可以调用showActivityset message让视图通过消息显示进度。

因为有状态小部件不会将其状态公开为属性,所以我不知道访问和修改状态属性的最佳方法。

我希望使用此方法的方式类似于:

Widget createStartupPage() {
    var page = new StartupPage();
    page.onAppSelected.listen((app) {
      page.showActivity = true;
      //Do some work
      page.showActivity = false;
    });
  }

我已经考虑过通过传递我希望它返回的状态来实例化窗口小部件,createState()但这感觉是错误的。

为什么使用这种方法的一些背景知识:我们目前有一个Dart
Web应用程序。为了实现视图控制器的分离,可测试性和对Flutter的前瞻性思考,我们决定为应用程序中的每个视图创建一个接口。这将允许WebComponent或Flutter
Widget实现此接口,并使所有控制器逻辑相同。


阅读 580

收藏
2020-08-13

共1个答案

一尘不染

您可以使用静态方法公开状态的窗口小部件,一些抖动示例以这种方式进行操作,我也开始使用它:

class StartupPage extends StatefulWidget {
  static _StartupPageState of(BuildContext context) => context.ancestorStateOfType(const TypeMatcher<_StartupPageState>());

  @override
  _StartupPageState createState() => new _StartupPageState();
}

class _StartupPageState extends State<StartupPage> {
  ...
}

然后,您可以通过调用来访问该状态StartupPage.of(context).doSomething();

需要注意的是,您需要拥有一个BuildContext,并且该页面在其树的某个位置。

2020-08-13