Flutter错误:断言失败:行1785位置12:“hasSize”

4

我有一个在flutter中录制音频的代码。这段代码应该完美地运行而不出错,但每当我尝试从一个警示对话框中调用它时,就会出现错误。

performLayout()过程中抛出了以下断言: RenderShrinkWrappingViewport不支持返回内在尺寸。

计算内在尺寸需要实例化视口的每个子对象,这违背了视口的惰性特性。

如果你只是想在主轴方向上收缩视口,你应该只需给视口松散的约束即可实现该效果,而无需测量其内在尺寸。

我正在尝试将一个选项传递给弹出式对话框以记录音频。用户要从弹出屏幕而不是主屏幕录制音频。我做错了什么?

我现在的代码:

 Widget setupAlertDialoadContainer() {
    return ListView(
      shrinkWrap: true, //just set this property
      padding: const EdgeInsets.all(8.0),
      //children: listItems.toList(),
      children: <Widget>[
        Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Container(
              margin: EdgeInsets.only(top: 24.0, bottom: 16.0),
              child: Text(
                this._recorderTxt,
                style: TextStyle(
                  fontSize: 48.0,
                  color: Colors.black,
                ),
              ),
            ),
            _isRecording
                ? LinearProgressIndicator(
                    value: 100.0 / 160.0 * (this._dbLevel ?? 1) / 100,
                    valueColor: AlwaysStoppedAnimation<Color>(Colors.green),
                    backgroundColor: Colors.red,
                  )
                : Container()
          ],
        ),
        Row(
          children: <Widget>[
            Container(
              width: 56.0,
              height: 56.0,
              margin: EdgeInsets.all(10.0),
              child: FloatingActionButton(
                heroTag: "Record",
                onPressed: () {
                  if (!this._isRecording) {
                    return this.startRecorder();
                  }
                  this.stopRecorder();
                },
                child: this._isRecording ? Icon(Icons.stop) : Icon(Icons.mic),
              ),
            ),
          ],
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
        ),
        Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Container(
              margin: EdgeInsets.only(top: 60.0, bottom: 16.0),
              child: Text(
                this._playerTxt,
                style: TextStyle(
                  fontSize: 48.0,
                  color: Colors.black,
                ),
              ),
            ),
          ],
        ),
        Row(
          children: <Widget>[
            Container(
              width: 56.0,
              height: 56.0,
              margin: EdgeInsets.all(8.0),
              child: FloatingActionButton(
                heroTag: "Start",
                onPressed: () {
                  startPlayer();
                },
                child: Icon(Icons.play_arrow),
              ),
            ),
            Container(
              width: 56.0,
              height: 56.0,
              margin: EdgeInsets.all(8.0),
              child: FloatingActionButton(
                heroTag: "Pause",
                onPressed: () {
                  pausePlayer();
                },
                child: Icon(Icons.pause),
              ),
            ),
            Container(
              width: 56.0,
              height: 56.0,
              margin: EdgeInsets.all(8.0),
              child: FloatingActionButton(
                heroTag: "Stop",
                onPressed: () {
                  stopPlayer();
                },
                child: Icon(Icons.stop),
              ),
            ),
          ],
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
        ),
        Container(
            height: 56.0,
            child: Slider(
                value: slider_current_position,
                min: 0.0,
                max: max_duration,
                onChanged: (double value) async {
                  await flutterSound.seekToPlayer(value.toInt());
                },
                divisions: max_duration.toInt()))
      ],
    );
  }

我该如何将数据传递给警告对话框

showDialog(
                        context: context,
                        builder: (BuildContext context) {
                          return AlertDialog(
                            title: Text('Record the data collection'),
                            content: setupAlertDialoadContainer(),
                          );
                        });

2
你尝试过用Expanded包装你的ListView吗? - Andrej
当我尝试这样做时,我遇到了错误:“ParentDataWidget Expanded(flex:1)希望将类型为FlexParentData的ParentData应用于RenderObject,但已设置为接受不兼容类型的BoxParentData的ParentData。” - blackbird
尝试使用RowColumnExpanded包装起来。 - Andrej
错误 如果您只是想在主轴方向上缩小视口,您应该能够通过给视口松散的约束条件来实现该效果,而无需测量其固有尺寸。 - blackbird
尝试使用Container进行包装,并给它设置宽度属性。 - Andrej
1个回答

3

当打开警告框时,是否显示错误?如果是,我的建议是使用

showDialog(
                        context: context,
                        builder: (BuildContext context) {
                          return AlertDialog(
                            title: Text('Record the data collection'),
                            content: Container(
                                       child:setupAlertDialoadContainer(),
                                       height:200,
                                       width:200,
                                      ),
                          );
                        });
根据您的需要更改容器的宽度和高度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接