从StatefulWidget外部控制状态
我正在尝试了解在Widget状态之外控制StatefulWidget状态的最佳实践。
我定义了以下接口。
abstract class StartupView { Stream<String> get onAppSelected;
set showActivity(bool activity);
set message(String message);
}
我想创建一个StartupPage
实现此接口的StatefulWidget 。我希望该小部件可以执行以下操作:
当按下按钮时,它将通过onAppSelected流发送事件。控制器甚至会监听此消息并执行某些操作(db调用,服务请求等)。
控制器可以调用
showActivity
或set 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