Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 将主颤振脚手架(AppBar和TabBar和弹出菜单、抽屉、主体)分散在单独的较小文件上?_Dart_Flutter - Fatal编程技术网

Dart 将主颤振脚手架(AppBar和TabBar和弹出菜单、抽屉、主体)分散在单独的较小文件上?

Dart 将主颤振脚手架(AppBar和TabBar和弹出菜单、抽屉、主体)分散在单独的较小文件上?,dart,flutter,Dart,Flutter,“Allo 我的主文件有多达1000行代码,我忍不住想把脚手架分成3或4个.dart文件可以节省时间。这可能吗 在AppBar和Drawer之间,由于所有的链接和设计参数,我已经有了500多行代码。我想把这段代码解压出来,而不是在处理主体时不断滚动 每当我想把抽屉拿出来放在一个单独的文件里时,到处都会出错。“动态”和“小部件”以及返回类型等的问题 我怎样才能取出脚手架并将其引用到另一个文件中 child: new Scaffold( appBar: new AppBar( botto

“Allo

我的主文件有多达1000行代码,我忍不住想把脚手架分成3或4个.dart文件可以节省时间。这可能吗

在AppBar和Drawer之间,由于所有的链接和设计参数,我已经有了500多行代码。我想把这段代码解压出来,而不是在处理主体时不断滚动

每当我想把抽屉拿出来放在一个单独的文件里时,到处都会出错。“动态”和“小部件”以及返回类型等的问题

我怎样才能取出脚手架并将其引用到另一个文件中

child: new Scaffold(
  appBar: new AppBar(
    bottom: new TabBar(tabs:[.....]),
    actions: <Widget> [
      new PopupMenuButton<xx>()
      ],),],),  //end appBar
  drawer: new Drawer(......),   //end drawer
  body: TabBarView(....),   //end body
  ),  //end scaffold
child:新脚手架(
appBar:新的appBar(
底部:新选项卡栏(选项卡:[……]),
行动:[
新的PopupMenuButton()
],),],),//结束appBar
抽屉:新抽屉(……)//结束抽屉
body:TabBarView(…),//结束body
),//端部脚手架
我不介意将主体放在这个主文件中,但如果我有更多的选择,我也可以将其删除。只需将1000多行代码缩减为2-3个块,即具有可管理空间的文件


有什么想法吗?

肯定有一种方法可以跨不同的文件组织这些想法。除了更易于维护和测试外,如果涉及状态,这还可能提高性能(因为如果状态发生更改,您必须重建整个树,而不仅仅是重建叶节点)

然而,这也意味着,如果您在一个大型的
build()
方法中涉及并散布了state,那么在跨文件组织时,您可能会有一些额外的注意事项。这是假设您将创建新的自定义小部件来包装各种组件,并且需要适当地编排状态

因此,为了将此构建方法分解为不同的子小部件,我建议您首先将其分解为函数:

发件人:


当然,有一种方法可以跨不同的文件进行组织。除了更易于维护和测试外,如果涉及状态,这还可能提高性能(因为如果状态发生更改,您必须重建整个树,而不仅仅是重建叶节点)

然而,这也意味着,如果您在一个大型的
build()
方法中涉及并散布了state,那么在跨文件组织时,您可能会有一些额外的注意事项。这是假设您将创建新的自定义小部件来包装各种组件,并且需要适当地编排状态

因此,为了将此构建方法分解为不同的子小部件,我建议您首先将其分解为函数:

发件人:


最简单的方法是:

Widget build(BuildContext context) {
  return Scaffold(
    appBar: _buildAppBar(),
    ...
  );
}

Widget _buildAppBar() {
  return AppBar(...);
}
您还可以使用单独的小部件。
appBar
插槽中的小部件必须实现
PreferredSizeWidget

class TestPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: MyAppBar(),
      body: MyBody(),
    );
  }
}

class MyAppBar extends StatelessWidget implements PreferredSizeWidget {
  @override
  Size get preferredSize => Size.fromHeight(kToolbarHeight); // whatever height you want

  @override
  Widget build(BuildContext context) {
    return AppBar();
  }
}

class MyBody extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Text('Hello World'),
      ),
    );
  }
}
当然,如果将它们放在不同的文件中,则必须导入:

import 'package:myapp/widgets/some_widget.dart';

最简单的方法是:

Widget build(BuildContext context) {
  return Scaffold(
    appBar: _buildAppBar(),
    ...
  );
}

Widget _buildAppBar() {
  return AppBar(...);
}
您还可以使用单独的小部件。
appBar
插槽中的小部件必须实现
PreferredSizeWidget

class TestPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: MyAppBar(),
      body: MyBody(),
    );
  }
}

class MyAppBar extends StatelessWidget implements PreferredSizeWidget {
  @override
  Size get preferredSize => Size.fromHeight(kToolbarHeight); // whatever height you want

  @override
  Widget build(BuildContext context) {
    return AppBar();
  }
}

class MyBody extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Text('Hello World'),
      ),
    );
  }
}
当然,如果将它们放在不同的文件中,则必须导入:

import 'package:myapp/widgets/some_widget.dart';

有关如何轻松重构小部件的信息,请参见。然后,您可以轻松地将该小部件移动到它自己的单独文件中,以了解如何轻松地重构您的小部件。然后,您可以轻松地将该小部件移动到它自己的单独文件中。您的上一个示例不会编译,因为
MyAppBar
没有实现
PreferredSizeWidget
@boformer,啊,是的。也许最好将AppBar的其他部分划分成子窗口小部件。FWIW,我通常只是将AppBar构造移动到一个单独的函数,而不是单独的文件/小部件。并且只将可重用的部分移动到单独的类中。您也可以尝试扩展AppBar而不是Ashton。我想知道州的因素。现在,我必须检查一下应用程序栏和抽屉,然后做出决定。那么,您是否只是将AppBar放在文件的底部,并在必要时将无状态wedgets移动到单独的dart文件中?@lubi,是的,您可以根据需要将小部件构建移动到其他方法或文件/小部件中。如果您创建新的小部件/文件,它们可以是无状态的、有状态的或扩展其他小部件。扩展其他小部件不是一个好主意。最好使用composition上一个示例不会编译,因为
MyAppBar
没有实现
PreferredSizeWidget
@boformer,是的。也许最好将AppBar的其他部分划分成子窗口小部件。FWIW,我通常只是将AppBar构造移动到一个单独的函数,而不是单独的文件/小部件。并且只将可重用的部分移动到单独的类中。您也可以尝试扩展AppBar而不是Ashton。我想知道州的因素。现在,我必须检查一下应用程序栏和抽屉,然后做出决定。那么,您是否只是将AppBar放在文件的底部,并在必要时将无状态wedgets移动到单独的dart文件中?@lubi,是的,您可以根据需要将小部件构建移动到其他方法或文件/小部件中。如果您创建新的小部件/文件,它们可以是无状态的、有状态的或扩展其他小部件。扩展其他小部件不是一个好主意。最好使用合成法。特别是喜欢的尺码,谢谢。特别是关于首选尺寸的边条。
class TestPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: MyAppBar(),
      body: MyBody(),
    );
  }
}

class MyAppBar extends StatelessWidget implements PreferredSizeWidget {
  @override
  Size get preferredSize => Size.fromHeight(kToolbarHeight); // whatever height you want

  @override
  Widget build(BuildContext context) {
    return AppBar();
  }
}

class MyBody extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Text('Hello World'),
      ),
    );
  }
}
import 'package:myapp/widgets/some_widget.dart';