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
Flutter 如何获得递归构建的小部件的高度?_Flutter_Flutter Layout - Fatal编程技术网

Flutter 如何获得递归构建的小部件的高度?

Flutter 如何获得递归构建的小部件的高度?,flutter,flutter-layout,Flutter,Flutter Layout,我有一个递归构建的小部件,我需要在包含递归调用的小部件的同一行中找到另一个小部件的高度。 我尝试使用LayoutBuilder获取父级的高度,但由于扩展了小部件,因此无法正常工作。 在构建小部件之前,我曾尝试使用方法通过键查找高度,但在递归情况下不起作用 代码 类MyWidget扩展了StatefulWidget{ 常量MyWidget({ 关键点, }):super(key:key); @凌驾 _MyWidgetState createState()=>\u MyWidgetState();

我有一个递归构建的小部件,我需要在包含递归调用的小部件的同一行中找到另一个小部件的高度。 我尝试使用LayoutBuilder获取父级的高度,但由于扩展了小部件,因此无法正常工作。 在构建小部件之前,我曾尝试使用方法通过键查找高度,但在递归情况下不起作用

代码

类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;
  }
}