加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flutter – 如何在垂直(高度)和水平(宽度)方向上实现窗口小部件

发布时间:2020-12-14 14:48:34 所属栏目:百科 来源:网络整理
导读:下面的代码列出了一个图表,我需要在图表中实现图表在垂直(高度)和水平(宽度)方向上的扩展.建议的方法(例如 https://docs.flutter.io/flutter/widgets/Row-class.html)是在行或列中使用扩展. 我试图扩展的图表小部件扩展了CustomPaint,没有子节点,所有内容都
下面的代码列出了一个图表,我需要在图表中实现图表在垂直(高度)和水平(宽度)方向上的扩展.建议的方法(例如 https://docs.flutter.io/flutter/widgets/Row-class.html)是在行或列中使用扩展.

我试图扩展的图表小部件扩展了CustomPaint,没有子节点,所有内容都是使用CustomPainter.paint(画布,大小)在画布上使用CustomPainter绘制的.

这段代码

return new Scaffold(
  appBar: new AppBar(
    title: new Text(widget.title),),body: new Center(    
    child: new Column(
      mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
        new Text(
          'vvvvvvvv:',new RaisedButton(
          color: Colors.green,onPressed: _chartStateChanger,new Text(
          'vvvvvvvv:',new Expanded( // Expanded in Column,no expansion vertically 
          child: new Row(
            children: [
              new Text('>>>'),new Expanded(// Expanded in Row,expands horizontally
                child: new Chart(  // extends CustomPaint
                  // size: chartLogicalSize,painter: new ChartPainter( // extends CustomPainter
                    chartData: _chartData,chartOptions: _chartOptions,new Text('<<<'),],// row
        ),new Text('^^^^^^:'),);

结果如下所示:(为简洁起见,未显示ChartPainter的代码)

result of the above code

在ChartPainter.paint(画布,大小)内部有一个print()打印大小.

print(” ### Size: paint(): passed size = ${size}”);

上面的paint->打印的结果是:

I/flutter ( 4187): ### Size: paint(): passed size = Size(340.0,0.0)

打印与图像一起显示,行级别的宽度扩展已传递给CustomPainter.print(画布,大小)(宽度= 340.0),但列上的高度扩展未传递给自定义画家打印(身高= 0.0).虽然结果显示行确实得到了它的扩展高度,但如果没有在行内传递给CustomPainter – 接收到0高度.

我还需要改变什么来实现高度扩展?

谢谢

解决方法

这是针对您所看到的问题的简化测试用例.解决方案是为您的Row提供CrossAxisAlignment.stretch的crossAxisAlignment.否则,它将尝试确定CustomPaint的内在高度,因为它没有子项,所以它为零.

import 'package:flutter/material.dart';

// from https://stackoverflow.com/questions/45875334/how-to-achieve-expansion-of-a-widget-in-both-vertical-height-and-horizontal-w

class MyCustomPainter extends CustomPainter {
  @override
  void paint(Canvas canvas,Size size) {
    // NOT using crossAxisAlignment: CrossAxisAlignment.stretch => width = 222.0,height=0.0
    // using crossAxisAlignment: CrossAxisAlignment.stretch     => width = 222.0,height=560.0
    print("width = ${size.width},height=${size.height}");
    canvas.drawRect(Offset.zero & size,new Paint()..color = Colors.blue);
  }

  @override
  bool shouldRepaint(MyCustomPainter other) => false;
}
void main() {
  runApp(new MaterialApp(
    home: new Scaffold(
        body: new Column(
          mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
            new Text('Above Paint'),// Expanded - because we are in Column,expand the
            //            contained row's height
            new Expanded(
              child: new Row(
                // The crossAxisAlignment is needed to give content height > 0
                //   - we are in a Row,so crossAxis is Column,so this enforces
                //     to "stretch height".
                crossAxisAlignment: CrossAxisAlignment.stretch,children: <Widget>[
                  new Text('Left of Paint'),// Expanded - because we are in Row,expand the
                  //           contained Painter's width
                  new Expanded(
                    child: new CustomPaint(
                      painter: new MyCustomPainter(),new Text('Right of Paint'),new Text('Below Paint'),)
    ),));
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读