在为我的flutter应用程序开发某些屏幕时,我经常需要根据屏幕状态动态呈现窗口小部件。对于需要创建单独的小部件并包含它的情况,我可以这样做。
但是,在许多用例中,我需要呈现的内容不适合小部件,而是利用了页面中的现有状态。因此,我使用构建器方法将适当的窗口小部件呈现到页面。正如任何使用Flutter的人都知道的那样,这可能会导致冗长的代码,您需要在其中上下滚动很多才能到达需要处理的内容。
为了获得更好的可维护性,我希望将这些构建器方法移动到单独的文件中,然后仅将它们包括在内。这样可以更轻松地处理渲染的特定代码小部件,并使屏幕小部件更加整洁。
但是我还没有找到提取动态小部件代码的正确方法,该方法利用状态,调用状态的更新等。我正在寻找一种类型的“ include”文件,该文件会将代码插入到主屏幕并进行渲染,就好像它是核心代码的一部分一样。
这可能吗?如何实现?
答案 0 :(得分:0)
借助introduction of extension
members,我碰到了这种非常整洁的方式,可以完全实现您所描述的!
假设您有一个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
中声明!
extension
功能需要 Dart 2.6 。这在稳定频道中尚不可用,但我想应该在2019年底左右。因此,您需要使用dev
或master
通道:flutter channel dev
或flutter channel master
并更新environment
文件中的pubspec.yaml
约束:< / p>
environment:
sdk: '>=2.6.0-dev.8.2 <3.0.0'