我正在尝试了解在Widget状态之外控制StatefulWidget状态的最佳实践。
我定义了以下接口。
abstract class StartupView { Stream<String> get onAppSelected; set showActivity(bool activity); set message(String message); }
我想创建一个StartupPage实现此接口的StatefulWidget 。我希望该小部件可以执行以下操作:
StartupPage
当按下按钮时,它将通过onAppSelected流发送事件。控制器甚至会监听此消息并执行某些操作(db调用,服务请求等)。
控制器可以调用showActivity或set message让视图通过消息显示进度。
showActivity
set message
因为有状态小部件不会将其状态公开为属性,所以我不知道访问和修改状态属性的最佳方法。
我希望使用此方法的方式类似于:
Widget createStartupPage() { var page = new StartupPage(); page.onAppSelected.listen((app) { page.showActivity = true; //Do some work page.showActivity = false; }); }
我已经考虑过通过传递我希望它返回的状态来实例化窗口小部件,createState()但这感觉是错误的。
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();。
StartupPage.of(context).doSomething();
需要注意的是,您需要拥有一个BuildContext,并且该页面在其树的某个位置。