Желтые линии под текстовыми виджетами во Flutter?


132

Работаю над своим первым приложением для флаттера. На главном экране приложения этой проблемы нет, все тексты отображаются так, как должны.

Однако на этом новом экране, который я разрабатываю, у всех текстовых виджетов есть какая-то странная желтая линия / двойная линия внизу.

Есть идеи, почему это происходит?

Желтые линии


Вы можете добавить свой код?
aziza

17
Я подозреваю, что причина в том, что на этой странице нет эшафота.
aziza

@aziza Думаю, ты прав. На этой странице нет эшафота. Я подозревал, что это может быть проблема, но не стал ее проверять. Есть идеи, почему это происходит, когда у меня нет эшафота? Я не понимал, что это необходимо. Должен ли я просто использовать Scaffold, даже если я буду использовать только параметр the_body_?
dasfima 05

2
Каждая страница нуждается в Scaffold, даже если вы реорганизуете меньшие виджеты в отдельные классы, они должны где-то иметь родительский Scaffold. Я не уверен, предназначено ли это для подчеркивания текста или это проблема, в любом случае вам придется создавать любую страницу в Scaffold.
aziza 05

3
Или , если вы хотите DONOT Scaffold, вы можете просто окружить Textс Materialвиджетом
realpac

Ответы:


164

Проблема не в том, есть Scaffoldили нет. Scaffoldявляется помощником для Materialприложений ( AppBar, Drawerи тому подобного). Но вас не заставляют использовать Material.

Вам не хватает экземпляра Themeродительского элемента .

Почему это важно знать? Потому что, когда вы будете разрабатывать модальное окно ( showDialogнапример, используя ), вы столкнетесь с той же проблемой. НО Scaffold - это непрозрачный полноэкранный виджет! И вы, очевидно, не хотите этого в вашем модальном окне.

Есть много способов представить экземпляр темы. В приложении Material это обычно достигается путем создания экземпляра Materialвиджета. И угадайте, что? Scaffoldсоздает для вас. Но Dialogтоже!


3
Также имейте в виду, что для Героя он отключен от родителя во время «полета», поэтому добавление Material(или любой темы) в качестве дочернего элемента Героя (ОБЕИХ сторон) исправляет его при переходе. См github.com/flutter/flutter/issues/30647
aaronvargas

81

Добавить Materialвиджет как корневой элемент.

@override
  Widget build(BuildContext context) {
    return Material(
        type: MaterialType.transparency,
        child: new Container(

1
Мне помогли окружающие textили widgetс Materialвиджетом. Добавление Материала в качестве корневого элемента не помогло в моем случае
ММК

1
работает как с ними, так type: MaterialType.transparencyи без них.
sassman

30

Вы можете использовать Scaffold(как правило, лучше) или любой другой компонент, который предоставляет материальную тему, например, простой Materialвиджет.

Вот пример, используйте любой из них:

var text = Scaffold(body: Text("Hi"),);
var text2 = Material(child: Text("Hi"),);

В качестве обходного пути вы можете использовать:

Text(
  'Your text',
  style: TextStyle(decoration: TextDecoration.none), // removes yellow line
)

16

У стиля текста есть аргумент оформления, которому можно присвоить значение none

Text("My Text",
  style: TextStyle(
    decoration: TextDecoration.none,
  )
);

Кроме того, как уже упоминалось, если ваш виджет Text находится в дереве виджета Scaffold или Material, вам не понадобится стиль текста оформления.



7

Просто добавляю еще один способ, с которым я сталкиваюсь, к этим ответам.

Оберните корневой виджет вокруг виджета DefaultTextStyle . Здесь нет необходимости изменять каждый текстовый виджет.

DefaultTextStyle(
    style: TextStyle(decoration: TextDecoration.none), 
    child : Your_RootWidget
)

Надеюсь, это кому-то поможет.


3

Вы должны добавить виджеты Material и Scaffold в файл main.dart.

 MaterialApp(
  home: Scaffold(
    body: Text('Hello world'),
  ),
);

2

Для этого есть другое решение, особенно если вы используете несколько страниц, заключенных в файл main.dart. Вы можете сделать что-то вроде этого:

  child: MaterialApp(
    home: Material(child: Wrapper()),
  ),

Это удалит желтые линии под текстом, который присутствует на всех страницах, на которые есть ссылки / которые используются в оболочке.


1

Вам просто нужно добавить корневой виджет Material.

      @override
       Widget build(BuildContext context) {
      return Material(
         child: new Container(),
        );
       }

0

Доступны 2 способа:

использовать scaffuld в родительском элементе экрана

Scaffold(body: Container(child:Text("My Text")))

использовать материал для родительского элемента виджета

Material(child: Text("My Text"))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.