Изменить подчеркивание текстового поля во Flutter

Я работаю над приложением с использованием Flutter SDK. Когда я использую виджет TextField и фокусирую его, подчеркивание становится синим. Мне нужно изменить этот цвет на красный, как я могу это сделать?

Скриншот того, что мне нужно изменить. Я хочу, чтобы изменилось только подчеркивание, а не цвет метки.

Скриншот того, что мне нужно изменить. (я хочу, чтобы изменилось подчеркивание, а не цвет метки)


person Tiziano Gioè    schedule 09.02.2018    source источник
comment
Человек, я работаю над флаттером. Тот, что вы написали - для родного андроида.   -  person Tiziano Gioè    schedule 09.02.2018
comment
Взгляните на эту проблему, может быть полезно, если вы хотите изменить цвет для всех входов. Кроме того, может быть полезно поделиться кодом темы вашего приложения.   -  person Mathieu de Lorimier    schedule 09.02.2018
comment
Кстати, вы, вероятно, захотите удалить теги Java и, возможно, Android.   -  person Rene    schedule 09.02.2018
comment
измените hintColor тему вашего приложения, return ThemeData.light().copyWith( hintColor: Colors.blueAccent,)   -  person AbdulMomen عبدالمؤمن    schedule 05.08.2018
comment
Это точно не дубликат. Android и Flutter - это совершенно разные технологии.   -  person George Hilliard    schedule 23.01.2019


Ответы (5)


Хотя эти другие ответы могут каким-то образом работать, вам определенно не следует использовать их. Это неправильный способ получить кастомную тему во Flutter.

Гораздо более элегантное решение выглядит следующим образом:

final theme = Theme.of(context);

return new Theme(
  data: theme.copyWith(primaryColor: Colors.red),
  child: new TextField(
    decoration: new InputDecoration(
      labelText: "Hello",
      labelStyle: theme.textTheme.caption.copyWith(color: theme.primaryColor),
    ),
  ),
);

В то же время, если вы просто хотите показать ошибку (красный), используйте вместо этого errorText из InputDecoration. Он автоматически установит красный цвет.

person Rémi Rousselet    schedule 09.02.2018
comment
Ваш ответ определенно выглядит лучше, но немного странно, что вам нужно изменить основной цвет на красный, а затем изменить все остальные стили на свой настоящий основной цвет. - person Rene; 10.02.2018
comment
Да я согласен. К сожалению, в настоящее время вы не можете изменить цвет подчеркивания, не переписав все. - person Rémi Rousselet; 10.02.2018
comment
Как установить выбранный цвет подчеркивания и цвет подчеркивания по умолчанию? Учтите, что в форме есть 4 текстовых поля, если я ввожу данные в текстовое поле 1, поэтому цвет текстового поля 1 и других текстовых полей. - person Mayur Prasad; 22.03.2018
comment
@ RémiRousselet Не могли бы вы помочь мне понять, что именно требуется для переписывания, чтобы изменить цвет подчеркивания на что-то другое. Потому что я тоже застрял в такой же ситуации. Вот моя ссылка на сообщение - stackoverflow.com/ questions / 49600139 / - person Suresh; 01.04.2018
comment
Тем, кто не смог понять ответ Реми, мне немного помог другой ответ: stackoverflow.com/questions/49600139/ - person user823447; 21.04.2019

Вы также можете изменить его цвет следующими способами.

  1. Оберните свой TextField в Theme и предоставьте accentColor

    Theme(
      data: Theme.of(context).copyWith(accentColor: Colors.red),
      child: TextField(),
    )
    
  2. Использование свойства inputDecoration.

    TextField(
      decoration: InputDecoration(
        focusedBorder: UnderlineInputBorder(
          borderSide: BorderSide(color: Colors.red),
        ),
      ),
    )
    
person CopsOnRoad    schedule 01.08.2019
comment
черт возьми, его трудно найти, но сейчас читаю, подчеркиваю границу ввода, его просто запомнить, спасибо OP - person Bruno Giubilei; 01.01.2020

Я использовал InputDecoration.collapsed для удаления разделителя и меняю цвет нижней границы.

При вводе имени цвет нижней границы будет синим, а при вводе числа или других специальных символов цвет нижней границы будет красный.

demo

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  static const EdgeInsets _padding = const EdgeInsets.symmetric(horizontal: 20.0, vertical: 8.0);
  Color borderColor = Colors.blue;
  bool nameFlag = false;

  @override
  void initState() {
    super.initState();
  }

  void validateName(String value) {
    final RegExp nameExp = new RegExp(r'^[A-Za-z ]+$');
    if (!nameExp.hasMatch(value) || value.isEmpty)
      borderColor = Colors.red;
    else
      borderColor = Colors.blue;
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new Column(children: <Widget>[
        new Flexible(
          child: new Container(
            margin: _padding,
            padding: _padding,
            child: new TextField(
              decoration: new InputDecoration.collapsed(
                hintText: "Enter Name",
              ),
              onChanged: (s) {
                setState(() => validateName(s));
              },
            ),
            decoration: new BoxDecoration(
              color: Colors.white,
              border: new Border(
                bottom: new BorderSide(color: borderColor, style: BorderStyle.solid),
              ),
            ),
          ),
        )
      ]),
    );
  }
}

Дайте мне знать, если это ответит на ваш вопрос :)

person Ajay Kumar    schedule 09.02.2018
comment
Слишком сложно для того, что это такое. Будет сложно поддерживать в долгосрочной перспективе. - person Rémi Rousselet; 10.02.2018
comment
@Darky На самом деле поддерживать его несложно. Вы можете создать собственный виджет как CustomTextFeild, который будет иметь все параметры TextField, а также какой-то настраиваемый, и использовать его везде. - person Ajay Kumar; 11.02.2018
comment
Труднее, чем просто завернуть свой TextField в Theme. Особенно в альфа-версии, где все выполняется довольно быстро (месяц назад inputDecorationTheme даже не существовало). - person Rémi Rousselet; 11.02.2018
comment
@Darky О да! Вы правы .... Пропустил свой ответ выше ... Круто, почему я не подумал об этом :) - person Ajay Kumar; 12.02.2018

Мы можем сделать это, используя свойство украшения enabledBorder: UnderlineInputBorder() в виджете TextField. Включенная граница имеет вложенное свойство borderSide: BorderSide(color), которое используется для определения цвета подчеркивания. Итак, в этом руководстве мы изменим цвет нижнего подчеркивания текстового поля ввода текста в примере приложения Flutter для Android iOS. Мы также изменили бы цвет подчеркивания TextField в фокусе.

Создайте виджет TextField в центральном обтекателе виджета в виджете «Контейнер».

enabledBorder - ›borderSide: BorderSide (цвет): используется для установки цвета подчеркивания ввода текста без фокуса. FocusBorder - ›borderSide: BorderSide (цвет): используется для установки цвета подчеркивания ввода текста в фокусе.

import 'package:flutter/material.dart';
  
  void main() => runApp(MyApp());
  
  class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
      return MaterialApp(
        home: Scaffold(
          body: SafeArea(
            child: Center(
              child : Container(
                width: 290,
                padding: EdgeInsets.all(10.0),
                child : TextField(
                        autocorrect: true,
                        decoration: InputDecoration(
                          hintText: 'Type Text Here',        
                          enabledBorder: UnderlineInputBorder(      
                            borderSide: BorderSide(color: Colors.red),   
                            ),  
                          focusedBorder: UnderlineInputBorder(
                          borderSide: BorderSide(color: Colors.green),
                      ),  
                    )
                )
              )
            )
        )
      ));
    }
  }
person Paresh Mangukiya    schedule 27.02.2021

Я еще не пробовал, но просмотрел для вас документацию.

Взглянув на класс TextField, вы можете установить InputDecoration, который, в свою очередь, имеет InputBorder. Установите для этого UnderlineInputBorder свой собственный BorderSide, я думаю, должен помочь. Вы можете установить цвет BorderSide.

Вы также можете установить InputBorder в глобальной InputDecorationTheme, если хотите, чтобы все текстовые поля должны иметь одинаковый стиль.

person Rene    schedule 09.02.2018
comment
дети: ‹Widget› [objectTextField = new TextField (украшение: new InputDecoration (border: new UnderlineInputBorder (borderSide: new BorderSide (color: Colors.redAccent)), ....... Я делаю что-то вроде этого, но это ничего не меняет. - person Tiziano Gioè; 09.02.2018
comment
Вы тоже пробовали установить тему оформления ввода? Похоже, он переопределяет установленный вами цвет оформления: (widget.decoration ?? const InputDecoration ()) .applyDefaults (Theme.of (context) .inputDecorationTheme); - person Rene; 09.02.2018
comment
Не работает. По непонятным причинам TextField внутренне переопределяет borderSide свойство inputDecorationTheme и строит его из основного цвета. - person Rémi Rousselet; 10.02.2018
comment
Настройка inputDecorationTheme у меня сработала. `` inputDecorationTheme: InputDecorationTheme (labelStyle: TextStyle (цвет: Colors.white), helperStyle: TextStyle (цвет: Colors.white), hintStyle: TextStyle (цвет: Colors.grey), focusBorder: UnderlineInputBorder (borderSide: BorderSide (borderSide: BorderSide) Цвета. Белый),)), '' - person surenyonjan; 13.12.2018