我创建了一个小部件,根据其
问题是,
例如,
那么,是否有某种设计模式或解决方案,使这两个小部件的参数在新小部件的构造函数中可用?
注:更多上下文,请参见此处的 M. Azyoksul在Gunter的评论中的评论。
问题的最小化示例:
FocusNode
的焦点,可以变成一个TextField
或Text
。它工作得很完美,这里是代码(由于太长,没有在此处包含)。问题是,
Text
和TextField
有很多参数可用于设置它们的样式,我认为将所有这些参数复制到我的新混合小部件的构造函数中,仅仅是为了在新的build
方法中将它们传递给这两个小部件而不做任何其他处理,不够优化。例如,
TextField
在其构造函数中有超过50个参数,如果要使用另一个小部件组合它并仍然获得所有这些选项以设置TextField
的样式,唯一的方法是将每个参数都复制到我的构造函数中,然后除了将它们传递给TextField
之外不做任何其他操作?那么,是否有某种设计模式或解决方案,使这两个小部件的参数在新小部件的构造函数中可用?
注:更多上下文,请参见此处的 M. Azyoksul在Gunter的评论中的评论。
问题的最小化示例:
// this widget is from external library (not under my control)
class WidgetA extends StatelessWidget {
// very long list of fields
A1 a1;
A2 a2;
... (long list of fields)
// constructor
WidgetA(this.a1, this.a2, ...);
}
// this widget is from external library
class WidgetB extends StatelessWidget {
// very long list of fields
B1 b1;
B2 b2;
... (long list of fields)
// constructor
WidgetB(this.b1, this.b2, ...);
}
// now this is the widget I want to create
class HybridWidget extends StatelessWidget {
// time consuming: I copy all the fields of WidgetA and
// WidgetB into the new constructor just to pass them as they are without doing anything else useful on them
A1 a1;
A2 a2;
...
B1 b1;
B2 b2;
...
// the new constructor: (not optimal at all)
HybridWidget(this.a1,this.a2,...,this.b1,this.b2,...);
@override
Widget build(BuildContext context) {
// for example:
if(some condition)
return Container(child:WidgetA(a1,a2, ...),...); <--- here is the problem, I am not doing anything other than passing the "styling" parameters as they were passed to me, alot of copy/paste
if(other condition)
return Container(Widget2(b1,b2, ... ),...); <--- and here is the same problem
//... other code
}
}
DoubleStateText
的用户现在可以持有对_focusNode
或textController
的引用,并且如果他们操作这些对象,则可能会破坏DoubleStateText
的功能。 - HIItypedefs
时存在误解。客户端/用户不传递textController
或focusNode
参数。这些由您的小部件DoubleStateText
填写/使用。最终用户实际上是传递了一个函数的“签名”,而不是它们的“值”。(text) =>
和(ctrl,node) =>
是所需的签名。然后,这些签名参数由您的DoubleStateText
小部件使用。(有点令人费解。) - BakerTextEditingController? outsideController; Widget w = DoubleStateText( textFieldBuilder: (ctrl, node) { outsideController = ctrl; //... }, ); }``` @Baker 这就是我的意思。
- HII