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