【问题标题】:How to remove space between widgets in Column in flutter?如何在颤动中删除列中小部件之间的空间?
【发布时间】:2019-06-02 17:41:15
【问题描述】:

我寻找答案,但找不到。

为什么 Column 小部件在子小部件之间留出空间?
我想为我的小部件布局删除它。下面是我的代码和空间位置。

代码!!

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  SystemChrome.setEnabledSystemUIOverlays([]);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Clock',
      theme: ThemeData(
        primaryColor: Colors.blue
      ),
      home: Social(),
      debugShowCheckedModeBanner: false,
    );
  }
}

class Social extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        elevation: 0.0
      ),
      backgroundColor: Colors.white,
      body: Column(
        children: <Widget>[
          Flexible(
            flex: 1,
            child: Row(
              children: <Widget>[
                ClipOval(
                  clipper: CircleClipper(),
                  child: Image.asset('assets/irene.jpg')
                ),
                Expanded(
                  child: Padding(
                    padding: const EdgeInsets.only(left: 8.0),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: <Widget>[
                        Align(
                          alignment: Alignment.centerLeft,
                          child: Text(
                            'Irene',
                            style: TextStyle(
                              color: Colors.blue,
                              fontWeight: FontWeight.bold,
                              fontSize: 15.0
                            )
                          )
                        ),
                        Align(
                          alignment: Alignment.centerLeft,
                          child: Text('Yesterday, Ney York')
                        )
                      ],
                    ),
                  ),
                ),
                Align(
                  alignment: Alignment.topRight,
                  child: IconButton(
                    color: Theme.of(context).primaryColor,
                    icon: Icon(Icons.menu),
                    onPressed: (){},
                  ),
                )
              ],
            ),
          ),
          Container(
            width: MediaQuery.of(context).size.width/1.1,
            height: MediaQuery.of(context).size.height/2,
            child: Card(
              child: Image.asset('assets/irene.jpg'),
              color: Colors.white,
              shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)),
              elevation: 10.0,
            ),
          ),
          Padding(
            padding: const EdgeInsets.only(left: 30.0,right: 30.0,top: 15.0),
            child: Row(
              children: <Widget>[
                Image(
                  image: AssetImage('assets/like.png'), 
                  width: 30.0,
                  height: 30.0,
                ),
                SizedBox(width: 20.0,),
                Image.asset('assets/chat.png'),
                Expanded(child: Container()),
                Image.asset('assets/share.png'),
              ],
            ),
          ),
          Expanded(child: Container()),
        ],
      ),
    );
  }
}

class CircleClipper extends CustomClipper<Rect> {
  @override
  Rect getClip(Size size) {
    return Rect.fromCircle(center: Offset(size.width/2,size.height/4), radius: size.width/3);
  }

  @override
  bool shouldReclip(CustomClipper<Rect> oldClipper) {
    return true;
  }
}

我该如何解决它以及我必须使用哪些小部件?
要制作 Column 的子小部件的大小,我必须使用 Flexible、Expanded 等。
有没有其他小部件可以满足这个条件?

【问题讨论】:

    标签: layout dart flutter


    【解决方案1】:

    那是因为您使用的是Flexible,它会扩展内部的Widget 以填充可用空间。

    改变这个:

       body: Column(
              children: <Widget>[
                Flexible(
                  flex: 1,
    

    到这里:

       body: Column(
              children: <Widget>[
                SizedBox(
                  height: 60.0,
    

    它应该可以工作

    【讨论】:

    • 在回答之前,我将Row修改为Stack并使用了Positioned,反正thx
    【解决方案2】:

    我发现问题不在于 Column 小部件,而在于它的第一个子小部件,它需要的高度比您预期的要长,我建议将来使用 Widget inspector 来诊断布局问题。

    这里是修复:

    1-这里不需要小部件,只需将其删除即可。

    Flexible(
            flex: 1, ...)
    

    2- 为您的头像图片设置适当的尺寸,方法是将其包裹在 Container 中,如下所示:

    Container(
      width: 50,
      height: 50,
      child: ClipOval(clipper: CircleClipper(), child: Image.asset('assets/irene.jpg')),
    )
    

    最后,这是更新后的完整代码:

    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    
        void main() {
          SystemChrome.setEnabledSystemUIOverlays([]);
          runApp(MyApp());
        }
    
        class MyApp extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return MaterialApp(
              title: 'Flutter Clock',
              theme: ThemeData(primaryColor: Colors.blue),
              home: Social(),
              debugShowCheckedModeBanner: false,
            );
          }
        }
    
        class Social extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return Scaffold(
              appBar: AppBar(backgroundColor: Colors.white, elevation: 0.0),
              backgroundColor: Colors.white,
              body: Column(
                children: <Widget>[
                  Row(
                    children: <Widget>[
                      Container(
                        width: 50,
                        height: 50,
                        child: ClipOval(clipper: CircleClipper(), child: Image.asset('assets/irene.jpg')),
                      ),
                      Expanded(
                        child: Padding(
                          padding: const EdgeInsets.only(left: 8.0),
                          child: Column(
                            mainAxisAlignment: MainAxisAlignment.start,
                            children: <Widget>[
                              Align(
                                  alignment: Alignment.centerLeft,
                                  child: Text('Irene',
                                      style: TextStyle(color: Colors.blue, fontWeight: FontWeight.bold, fontSize: 15.0))),
                              Align(alignment: Alignment.centerLeft, child: Text('Yesterday, Ney York'))
                            ],
                          ),
                        ),
                      ),
                      Align(
                        alignment: Alignment.topRight,
                        child: IconButton(
                          color: Theme.of(context).primaryColor,
                          icon: Icon(Icons.menu),
                          onPressed: () {},
                        ),
                      )
                    ],
                  ),
                  Container(
                    width: MediaQuery.of(context).size.width / 1.1,
                    height: MediaQuery.of(context).size.height / 2,
                    child: Card(
                      child: Image.asset('assets/irene.jpg'),
                      color: Colors.white,
                      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)),
                      elevation: 10.0,
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(left: 30.0, right: 30.0, top: 15.0),
                    child: Row(
                      children: <Widget>[
                        Icon(Icons.thumb_up, color: Colors.black),
                        SizedBox(
                          width: 20.0,
                        ),
                        Icon(Icons.chat, color: Colors.black),
                        Expanded(child: Container()),
                        Icon(Icons.share, color: Colors.black),
                      ],
                    ),
                  ),
                  Expanded(child: Container()),
                ],
              ),
            );
          }
        }
    

    【讨论】: