Flutter 如何获得递归构建的小部件的高度?
我有一个递归构建的小部件,我需要在包含递归调用的小部件的同一行中找到另一个小部件的高度。 我尝试使用LayoutBuilder获取父级的高度,但由于扩展了小部件,因此无法正常工作。 在构建小部件之前,我曾尝试使用方法通过键查找高度,但在递归情况下不起作用 代码Flutter 如何获得递归构建的小部件的高度?,flutter,flutter-layout,Flutter,Flutter Layout,我有一个递归构建的小部件,我需要在包含递归调用的小部件的同一行中找到另一个小部件的高度。 我尝试使用LayoutBuilder获取父级的高度,但由于扩展了小部件,因此无法正常工作。 在构建小部件之前,我曾尝试使用方法通过键查找高度,但在递归情况下不起作用 代码 类MyWidget扩展了StatefulWidget{ 常量MyWidget({ 关键点, }):super(key:key); @凌驾 _MyWidgetState createState()=>\u MyWidgetState();
类MyWidget扩展了StatefulWidget{
常量MyWidget({
关键点,
}):super(key:key);
@凌驾
_MyWidgetState createState()=>\u MyWidgetState();
}
类_MyWidgetState扩展状态{
TextEditingController\u TextEditingController;
GlobalKey _keyRed=GlobalKey();
@凌驾
void initState(){
WidgetsBinding.instance.addPostFrameCallback(_afterLayout);
_textEditingController=textEditingController();
super.initState();
}
_后布局{
_getSizes();
}
@凌驾
无效处置(){
_textEditingController.dispose();
super.dispose();
}
_getSizes(){
final RenderBox renderBoxRed=_keyRed.currentContext.findenderobject();
最终尺寸=renderBoxRed.size;
打印(“红色尺寸:$sizeRed”);
返回高度;
}
@凌驾
小部件构建(构建上下文){
//为了简洁起见,这里避免了递归停止的条件
返回容器(
孩子:排(
儿童:[
getLeadingWidget(),
扩大(
钥匙:_keyRed,
子:列(
mainAxisAlignment:mainAxisAlignment.start,
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
getTextField(注),
纵队(
儿童:
getChildren()
)
],
),
),
],
),
);
}
getLeadingWidget(){
返回布局生成器(
生成器:(上下文、约束)=>容器(
高度:约束。约束高度(),
子:容器(…)
));
}
getTextField(NotesModel注释){
返回TextFormField(
键盘类型:TextInputType.multiline,
maxLines:null,
控制器:_textededitingcontroller..text='TEST',
);
}
getChildrenNotes(int-noteId){
列出儿童注释=[];
对于(…){
//小部件递归调用
添加(MyWidget());
}
归还儿童票据;
}
}
包含相关小部件的图表:
class MyWidget extends StatefulWidget {
const MyWidget({
Key key,
}) : super(key: key);
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
TextEditingController _textEditingController;
GlobalKey _keyRed = GlobalKey();
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback(_afterLayout);
_textEditingController = TextEditingController();
super.initState();
}
_afterLayout(_) {
_getSizes();
}
@override
void dispose() {
_textEditingController.dispose();
super.dispose();
}
_getSizes() {
final RenderBox renderBoxRed = _keyRed.currentContext.findRenderObject();
final sizeRed = renderBoxRed.size;
print("SIZE of Red: $sizeRed");
return sizeRed.height;
}
@override
Widget build(BuildContext context) {
// condition for recursion to stop avoided here for brevity
return Container(
child: Row(
children: [
getLeadingWidget(),
Expanded(
key: _keyRed,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
getTextField(note),
Column(
children:
getChildren()
)
],
),
),
],
),
);
}
getLeadingWidget() {
return LayoutBuilder(
builder: (context, constraints) => Container(
height: constraints.constrainHeight(),
child: Container(...)
));
}
getTextField(NotesModel note) {
return TextFormField(
keyboardType: TextInputType.multiline,
maxLines: null,
controller: _textEditingController..text = 'TEST',
);
}
getChildrenNotes(int noteId) {
List<Widget> childrenNotes = [];
for (...) {
// widget called recursively
childrenNotes.add(MyWidget());
}
return childrenNotes;
}
}