Flutter - ตัดข้อความทับเช่นใส่จุดไข่ปลาหรือจาง


128

ฉันกำลังพยายามสร้างบรรทัดที่ข้อความตรงกลางมีขนาดสูงสุดและหากเนื้อหาข้อความใหญ่เกินไปแสดงว่ามีขนาดพอดี

ฉันแทรกTextOverflow.ellipsisคุณสมบัติเพื่อย่อข้อความและแทรกจุดสามจุด...แต่มันไม่ทำงาน

main.dart

import 'package:flutter/material.dart';

void main() {
runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) => new Scaffold(
    appBar: new AppBar(
      backgroundColor: new Color(0xFF26C6DA),
    ),
    body: new ListView  (
      children: <Widget>[
        new Card(
          child: new Container(
            padding: new EdgeInsets.symmetric(horizontal: 16.0, vertical: 18.0),
            child: new Row(
              children: <Widget>[
                new Container(
                  padding: new EdgeInsets.only(right: 24.0),
                  child: new CircleAvatar(
                    backgroundColor: new Color(0xFFF5F5F5),
                    radius: 16.0,
                  )
                ),
                new Container(
                  padding: new EdgeInsets.only(right: 13.0),
                  child: new Text(
                    'Text lar...',
                    overflow: TextOverflow.ellipsis,
                    style: new TextStyle(
                      fontSize: 13.0,
                      fontFamily: 'Roboto',
                      color: new Color(0xFF212121),
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
                new Container(
                  child: new Column(
                    crossAxisAlignment: CrossAxisAlignment.end,
                    children: <Widget>[
                      new Row(
                        children: <Widget>[
                          new Text(
                            'Bill  ',
                            style: new TextStyle(
                              fontSize: 12.0,
                              fontFamily: 'Roboto',
                              color: new Color(0xFF9E9E9E)
                            ),
                          ),
                          new Text(
                            '\$ -999.999.999,95',
                            style: new TextStyle(
                              fontSize: 14.0,
                              fontFamily: 'Roboto',
                              color: new Color(0xFF212121)
                            ),
                          ),
                        ],
                      ),
                      new Row(
                        children: <Widget>[
                          new Text(
                            'Limit  ',
                            style: new TextStyle(
                              fontSize: 12.0,
                              fontFamily: 'Roboto',
                              color: new Color(0xFF9E9E9E)
                            ),
                          ),
                          new Text(
                            'R\$ 900.000.000,95',
                            style: new TextStyle(
                              fontSize: 14.0,
                              fontFamily: 'Roboto',
                              color: new Color(0xFF9E9E9E)
                            ),
                          ),
                        ],
                      ),
                    ]
                  )
                )
              ],
            ),
          )
        ),
      ]
    )
  );
}

ผลลัพธ์:

ป้อนคำอธิบายภาพที่นี่

คาดว่า:

ป้อนคำอธิบายภาพที่นี่

คำตอบ:


257

คุณควรห่อของคุณContainerในFlexibleที่จะให้คุณRowรู้ว่ามันโอเคสำหรับContainerที่จะแคบกว่าความกว้างที่แท้จริงของมัน Expandedยังจะทำงาน

ภาพหน้าจอ

Flexible(
  child: new Container(
    padding: new EdgeInsets.only(right: 13.0),
    child: new Text(
      'Text largeeeeeeeeeeeeeeeeeeeeeee',
      overflow: TextOverflow.ellipsis,
      style: new TextStyle(
        fontSize: 13.0,
        fontFamily: 'Roboto',
        color: new Color(0xFF212121),
        fontWeight: FontWeight.bold,
      ),
    ),
  ),
),

2
ฉันมีปัญหาคล้ายกันในคอลัมน์ วิธีนี้ไม่ได้ผลสำหรับฉัน stackoverflow.com/questions/52206221/…
Michael Tedla

มีวิธีใดบ้างที่เราสามารถนำสิ่งนี้ไปใช้ในฟิลด์ข้อความ
mangkool

หากคุณต้องการให้มีข้อความ wrap_content ให้ระบุคุณสมบัติ fit ด้วย FlexFit.loose,
martinseal1987

วิธีนี้ไม่ได้ผลเสมอไป ในกรณีของฉันอุปกรณ์ประกอบฉาก TextFlow ทั้งหมดเช่น elipsis หรือ fade หรือ clip ใช้ไม่ได้กับข้อความภายใน InkWell และอยู่ภายในแถวและอีกแถว การเรียงสับเปลี่ยนทั้งหมดในแถวคอนเทนเนอร์ข้อความหมึกคอลัมน์ ฯลฯ พร้อม FAIL ที่ขยายและยืดหยุ่น
ombiro

115

การใช้ Ellipsis

Text(
  "This is a long text",
  overflow: TextOverflow.ellipsis,
),

ป้อนคำอธิบายภาพที่นี่


ใช้ Fade

Text(
  "This is a long text",
  overflow: TextOverflow.fade,
  maxLines: 1,
  softWrap: false,
),

ป้อนคำอธิบายภาพที่นี่


การใช้คลิป

Text(
  "This is a long text",
  overflow: TextOverflow.clip,
  maxLines: 1,
  softWrap: false,
),

ป้อนคำอธิบายภาพที่นี่


บันทึก:

หากคุณกำลังใช้TextภายในRowคุณสามารถใส่ข้างต้นTextภายในExpandedเช่น:

Expanded(
  child: AboveText(),
)

ฉันจะเพิ่มได้
ไหม

@ mr.hir ฉันขอโทษที่ฉันไม่เข้าใจ
CopsOnRoad

วิธีนี้ใช้ไม่ได้หากคุณมีข้อความและวิดเจ็ตอื่น (เช่นไอคอน) อยู่ตรงกลางแถว
Lukasz Ciastko

softWrap: falseคือสิ่งที่ฉันต้องการขอบคุณ!
coldembrace

เฮ้ถ้าเราต้องการเพิ่มเช่นหน้าใหม่ที่มีข้อความล้น?
นิธินสาย

22

คุณสามารถใช้การตัดโค้ดนี้เพื่อแสดงข้อความที่มีจุดไข่ปลา

Text(
    "Introduction to Very very very long text",
    maxLines: 1,
    overflow: TextOverflow.ellipsis,
    softWrap: false,
    style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold),
),

11
นอกจากนี้โปรดใส่คำอธิบายของรหัสนี้เพื่ออธิบายว่าจะตอบคำถามอย่างไร
jkdev


8

ขั้นแรกให้รวมRowหรือColumnในFlexibleหรือExpandedวิดเจ็ตของคุณแล้ว

Text(
    'your long text here',
    overflow: TextOverflow.fade,
    maxLines: 1,
    softWrap: false,
    style: Theme.of(context).textTheme.body1,
)

ใช่นี่เป็นวิธีที่ถูกต้องอันดับแรกการรวมคอลัมน์ภายใน Expanded ใช้งานได้จริง! และใช้ข้อความภายในคอลัมน์ลูก
ArifMustafa

5

วิธีหนึ่งในการแก้ไขปัญหาการล้นของวิดเจ็ตข้อความภายในแถวถ้าตัวอย่างเช่นข้อความแชทอาจเป็นบรรทัดที่ยาวมาก คุณสามารถสร้าง Container และ BoxConstraint ที่มี maxWidth ได้

            Container(
              constraints: BoxConstraints(maxWidth: 200),
                child: Text(
                  (chatName == null) ? " ": chatName,
                  style: TextStyle(
                      fontWeight: FontWeight.w400,
                      color: Colors.black87,
                      fontSize: 17.0),
                )
            ),


4
SizedBox(
    width: 200.0,
    child: Text('PRODUCERS CAVITY FIGHTER 50X140g',
                overflow: TextOverflow.ellipsis,
                style: Theme.of(context).textTheme.body2))

เพียงแค่รวมไว้ในวิดเจ็ตที่สามารถใช้ความกว้างเฉพาะเพื่อให้ใช้งานได้หรือจะถือว่าเป็นความกว้างของคอนเทนเนอร์หลัก


1

มีคำตอบมากมาย แต่จะสังเกตได้มากกว่านี้

1. คลิป

ตัดข้อความที่ล้นออกเพื่อแก้ไขคอนเทนเนอร์

SizedBox(
          width: 120.0,
          child: Text(
            "Enter Long Text",
            maxLines: 1,
            overflow: TextOverflow.clip,
            softWrap: false,
            style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 20.0),
          ),
        ),

เอาท์พุต:

ป้อนคำอธิบายภาพที่นี่

2. จาง

เลือนข้อความที่ล้นเป็นแบบโปร่งใส

SizedBox(
          width: 120.0,
          child: Text(
            "Enter Long Text",
            maxLines: 1,
            overflow: TextOverflow.fade,
            softWrap: false,
            style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 20.0),
          ),
        ), 

เอาท์พุต:

ป้อนคำอธิบายภาพที่นี่

3. เซลล์ประสาท

ใช้จุดไข่ปลาเพื่อระบุว่าข้อความมีมากเกินไป

SizedBox(
          width: 120.0,
          child: Text(
            "Enter Long Text",
            maxLines: 1,
            overflow: TextOverflow.ellipsis,
            softWrap: false,
            style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 20.0),
          ),
        ),

เอาท์พุต:

ป้อนคำอธิบายภาพที่นี่

4. มองไม่เห็น

แสดงข้อความที่ล้นออกนอกคอนเทนเนอร์

SizedBox(
          width: 120.0,
          child: Text(
            "Enter Long Text",
            maxLines: 1,
            overflow: TextOverflow.visible,
            softWrap: false,
            style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 20.0),
          ),
        ),

เอาท์พุต:

ป้อนคำอธิบายภาพที่นี่

กรุณาบล็อก: https://medium.com/flutterworld/flutter-text-wrapping-ellipsis-4fa70b19d316


0

ฉันคิดว่าคอนเทนเนอร์หลักต้องได้รับ maxWidth ของขนาดที่เหมาะสม ดูเหมือนว่ากล่องข้อความจะเติมเต็มช่องว่างที่ให้ไว้ด้านบน


0

ขึ้นอยู่กับสถานการณ์ของคุณฉันคิดว่านี่เป็นแนวทางที่ดีที่สุดด้านล่าง

final maxWidth = MediaQuery.of(context).size.width * 0.4;
Container(
        textAlign: TextAlign.center),
        child: Text('This is long text',
        constraints: BoxConstraints(maxWidth: maxWidth),
),

0

หากคุณเพียงแค่วางข้อความเป็นลูก (Ren) ของคอลัมน์นี่เป็นวิธีที่ง่ายที่สุดในการตัดข้อความโดยอัตโนมัติ สมมติว่าคุณไม่มีอะไรซับซ้อนเกิดขึ้น ในกรณีดังกล่าวฉันคิดว่าคุณจะสร้างขนาดคอนเทนเนอร์ของคุณตามที่เห็นสมควรและใส่คอลัมน์อื่นเข้าไปข้างในแล้วตามด้วยข้อความของคุณ ดูเหมือนว่าจะทำงานได้ดี ภาชนะบรรจุต้องการลดขนาดของเนื้อหาและดูเหมือนว่าจะขัดแย้งกับการห่อโดยธรรมชาติซึ่งต้องใช้ความพยายามมากขึ้น

Column(
  mainAxisSize: MainAxisSize.min,
  children: <Widget>[
    Text('This long text will wrap very nicely if there isn't room beyond the column\'s total width and if you have enough vertical space available to wrap into.',
      style: TextStyle(fontSize: 16, color: primaryColor),
      textAlign: TextAlign.center,),
  ],
),

-3

ลอง:

 Expanded(
  child: Container(
      child: Text('OVER FLOW TEST TEXTTTT',
          overflow: TextOverflow.fade)),
),

OVER FLOWนี้จะแสดง หากมีน้ำล้นก็จะจัดการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.