Żółte linie pod widżetami tekstowymi we Flutter?


132

Pracuję nad moją pierwszą aplikacją Flutter. Główny ekran aplikacji nie ma tego problemu, wszystkie teksty są wyświetlane tak, jak powinny.

Jednak na tym nowym ekranie, który tworzę, cały widżet tekstowy ma pod spodem dziwną żółtą linię / podwójną linię.

Jakieś pomysły, dlaczego tak się dzieje?

Żółte linie


Czy możesz dodać swój kod?
aziza

17
Podejrzewam, że powodem jest to, że nie masz rusztowania na tej stronie.
aziza

@aziza Myślę, że masz rację. Ta strona nie ma rusztowania. Podejrzewałem, że to może być problem, ale nie sprawdziłem tego. Jakieś pomysły, dlaczego tak się dzieje, gdy nie mam rusztowania? Nie zdawałem sobie sprawy, że to konieczne. Czy i tak powinienem po prostu użyć Scaffolda, mimo że zamierzam używać tylko parametru_body_?
dasfima

2
Każda strona wymaga Scaffolda, nawet jeśli refaktoryzujesz mniejsze widżety na oddzielne klasy, powinny one gdzieś znaleźć się nadrzędnym Scaffold. Nie jestem pewien, czy w ten sposób tekst ma być podkreślony, czy też jest to problem, niezależnie od tego, w końcu będziesz musiał zbudować dowolną stronę w Scaffold.
aziza

3
Lub jeśli dawca chcesz Scaffold, możesz po prostu otoczyć Textz Materialwidget
realpac

Odpowiedzi:


164

Problem polega na tym, że nie masz Scaffoldlub nie. ScaffoldJest pomocnikiem dla Materialaplikacji ( AppBar, Drawer, tego typu rzeczy). Ale nie jesteś zmuszony do używania Material.

Brakuje Ci przykładu Themejako rodzica.

Dlaczego warto to wiedzieć? Ponieważ kiedy opracujesz Modal (używając showDialogna przykład), napotkasz ten sam problem. ALE Scaffold to nieprzezroczysty widżet pełnoekranowy! I oczywiście nie chcesz tego w swoim Modalu.

Istnieje wiele sposobów wprowadzenia instancji Theme. W aplikacji Material jest to zwykle osiągane przez utworzenie wystąpienia MaterialWidżetu. I zgadnij co? Scaffoldtworzy go dla Ciebie. Ale Dialogteż!


3
Pamiętaj również, że w przypadku Bohatera jest on odłączony od rodzica podczas „lotu”, więc dodanie Material(lub dowolnego motywu) jako dziecka Bohatera (OBIE strony) naprawia to podczas przejścia. Zobacz github.com/flutter/flutter/issues/30647
aaronvargas,

81

Dodaj Materialwidżet jako element główny.

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

1
otaczającej textlub widgetz Materialwidget pomógł mi. Dodanie materiału jako elementu głównego nie pomogło w moim przypadku
MMK

1
działa zarówno z, jak type: MaterialType.transparencyi bez.
sassman

30

Możesz użyć Scaffold(ogólnie lepiej) lub dowolnego innego komponentu, który zapewnia materiałowy motyw, taki jak prosty Materialwidget.

Oto przykład, użyj dowolnego z nich:

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

Aby obejść ten problem, możesz użyć:

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

16

Styl tekstu ma argument dekoracji, który może być ustawiony na brak

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

Ponadto, jak wspominali inni, jeśli widget Tekst znajduje się w drzewie widgetu Rusztowanie lub Materiał, nie będzie potrzebny styl tekstu dekoracji.



7

Po prostu dodam inny sposób, w jaki napotykam te odpowiedzi.

Owiń główny widget wokół widgetu DefaultTextStyle . Zmiana każdego widżetu Tekst nie jest tutaj koniecznością.

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

Mam nadzieję, że to komuś pomoże.


3

Powinieneś dodać widżety Materiał i Rusztowanie w pliku main.dart

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

2

Jest na to inne rozwiązanie, zwłaszcza jeśli używasz wielu stron opakowanych w pliku main.dart. Możesz zrobić coś takiego:

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

Spowoduje to usunięcie żółtych linii pod tekstem, który jest obecny na wszystkich stronach, do których istnieją odwołania / są używane w opakowaniu.


1

Wystarczy dodać widżet główny Material.

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

0

Dostępne są 2 sposoby:

użyj scaffuld w rodzicu ekranu

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

użyj materiału dla rodzica widgetu

Material(child: Text("My Text"))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.