[为我的flutter应用程序开发某些屏幕时,我经常需要根据屏幕状态动态呈现窗口小部件。对于需要创建单独的小部件并包含它的情况,我可以这样做。
但是,在许多用例中,我需要呈现的内容不适合小部件,而是利用了页面中的现有状态。因此,我使用构建器方法将适当的窗口小部件呈现到页面。正如使用Flutter的任何人都知道的那样,这可能会导致冗长的代码,您需要在其中上下滚动很多才能找到所需的内容。
为了获得更好的可维护性,我希望将这些构建器方法移至单独的文件中,然后仅将它们包括在内。这样可以更轻松地处理渲染的特定代码小部件,并使屏幕小部件更加整洁。
但是我还没有找到提取动态窗口小部件代码的适当方法,该方法利用状态,调用状态的更新等。我正在寻找一种类型的“ include”文件,该文件会将代码插入主窗口屏幕并进行渲染,就好像它是核心代码的一部分。
这可能吗?如何实现?
introduction of extension
members,我碰到了这种非常整洁的方法,可以完全实现您所描述的!
假设您有一个这样定义的extension
类:
State
如您所见,有一个局部变量class MyWidgetState extends State<MyWidget> {
int cakes;
@override
void initState() {
super.initState();
cakes = 0;
}
@override
Widget build(BuildContext context) {
return Builder(
builder: (context) => Text('$cakes'),
);
}
}
和一个cakes
函数。现在,提取此构建器的一种非常简洁的方法是:
builder
现在,即使扩展名放在另一个文件中,也可以从extension CakesBuilderExtension on MyWidgetState {
Widget cakesBuilder(BuildContext context) {
return Text('$cakes');
}
}
访问cakes
成员。
现在,您将像这样更新extension
类(State
已更改:]
builder
即使仅在class MyWidgetState extends State<MyWidget> {
int cakes;
@override
void initState() {
super.initState();
cakes = 0;
}
@override
Widget build(BuildContext context) {
return Builder(
builder: cakesBuilder,
);
}
}
中声明,也可以从cakesBuilder
中引用MyWidgetState
!>>
CakesBuilderExtension
功能需要Dart 2.6。这在稳定频道中尚不可用,但我想应该在2019年底左右。因此,您需要使用extension
或dev
通道:master
或flutter channel dev
,并更新flutter channel master
文件中的environment
约束:
pubspec.yaml