将小部件生成器之类的类成员提取到其他文件?

时间:2019-10-25 14:11:30

标签: flutter dart flutter-layout

在为我的flutter应用程序开发某些屏幕时,我经常需要根据屏幕状态动态呈现窗口小部件。对于需要创建单独的小部件并包含它的情况,我可以这样做。

但是,在许多用例中,我需要呈现的内容不适合小部件,而是利用了页面中的现有状态。因此,我使用构建器方法将适当的窗口小部件呈现到页面。正如任何使用Flutter的人都知道的那样,这可能会导致冗长的代码,您需要在其中上下滚动很多才能到达需要处理的内容。

为了获得更好的可维护性,我希望将这些构建器方法移动到单独的文件中,然后仅将它们包括在内。这样可以更轻松地处理渲染的特定代码小部件,并使屏幕小部件更加整洁。

但是我还没有找到提取动态小部件代码的正确方法,该方法利用状态,调用状态的更新等。我正在寻找一种类型的“ include”文件,该文件会将代码插入到主屏幕并进行渲染,就好像它是核心代码的一部分一样。

这可能吗?如何实现?

1 个答案:

答案 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年底左右。因此,您需要使用devmaster通道:flutter channel devflutter channel master并更新environment文件中的pubspec.yaml约束:< / p>

environment:
  sdk: '>=2.6.0-dev.8.2 <3.0.0'