从StatefulWidget外部控制状态

我正在尝试了解在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实现此接口,并使所有控制器逻辑相同。

回答:

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

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,并且该页面在其树的某个位置。

以上是 从StatefulWidget外部控制状态 的全部内容, 来源链接: utcz.com/qa/420512.html

回到顶部