无法更改TextField边框颜色


76

我想改变我的边框颜色TextField使用BorderSide,但它不是不工作。

这是我的下面的代码。

new TextField(
  decoration: new InputDecoration(
    border: new OutlineInputBorder(
      borderSide: new BorderSide(color: Colors.teal)
    ),
    hintText: 'Tell us about yourself',
    helperText: 'Keep it short, this is just a demo.',
    labelText: 'Life story',
    prefixIcon: const Icon(Icons.person, color: Colors.green,),
    prefixText: ' ',
    suffixText: 'USD',
    suffixStyle: const TextStyle(color: Colors.green)),
  )
)

结果的屏幕截图如下所示。

Answers:


84

由于屏幕上设置了默认主题,因此该设置没有改变。

因此,只需使用新的ThemeData()包装TextField即可为您正在绘制的小部件更改它们

child: new Theme(
          data: new ThemeData(
            primaryColor: Colors.redAccent,
            primaryColorDark: Colors.red,
          ),
          child: new TextField(
            decoration: new InputDecoration(
                border: new OutlineInputBorder(
                    borderSide: new BorderSide(color: Colors.teal)),
                hintText: 'Tell us about yourself',
                helperText: 'Keep it short, this is just a demo.',
                labelText: 'Life story',
                prefixIcon: const Icon(
                  Icons.person,
                  color: Colors.green,
                ),
                prefixText: ' ',
                suffixText: 'USD',
                suffixStyle: const TextStyle(color: Colors.green)),
          ),
        ));

在此处输入图片说明


您已经可以看到它的实际效果。它只是屏幕小部件的主题颜色不会被覆盖
拿破仑(Napolean)'18年

96

新方法是这样使用的enabledBorder

new TextField(
  decoration: new InputDecoration(
    enabledBorder: const OutlineInputBorder(
      borderSide: const BorderSide(color: Colors.grey, width: 0.0),
    ),
    focusedBorder: ...
    border: ...
  ),
)

5
enabledBorder与Border有何不同?
stickedoverflow

2
@stuckedoverflow直觉会建议border应每当一个默认值行事enabledBorderdisabledBorderfocusedBordererrorBorder,或focusedErrorBorder在任何这些边界的使用情况省略。但是,似乎根本没有InputDecorator引用的build方法border。它不是在用例之外InputDecorator还是一个bug(是从未实际使用过的字段)。
Abion47年

1
@ Abion47该border属性涵盖了您希望的所有5种情况,例如,您可以设置borderRadius,它将影响所有情况。但是InputBorder.borderSide,必须单独覆盖它。Doc:api.flutter.dev/flutter/material/InputDecoration/border.html
user1032613 '20

60

好吧,我真的不知道为什么分配给边框的颜色不起作用。但是您可以使用文本字段的其他边框属性来控制边框颜色。他们是:

  1. disabledBorder:启用设置为false时激活
  2. enabledBorder:启用设置为true时激活(默认情况下,TextField的enabled属性为true)
  3. errorBorder:出现某些错误(即验证失败)时被激活
  4. focusBorder:当我们单击/关注TextField时被激活。
  5. focusErrorBorder:在出现错误且当前我们专注于该TextField时激活。

下面是一个代码段:

TextField(
 enabled: false, // to trigger disabledBorder
 decoration: InputDecoration(
   filled: true,
   fillColor: Color(0xFFF2F2F2),
   focusedBorder: OutlineInputBorder(
     borderRadius: BorderRadius.all(Radius.circular(4)),
     borderSide: BorderSide(width: 1,color: Colors.red),
   ),
   disabledBorder: OutlineInputBorder(
     borderRadius: BorderRadius.all(Radius.circular(4)),
     borderSide: BorderSide(width: 1,color: Colors.orange),
   ),
   enabledBorder: OutlineInputBorder(
     borderRadius: BorderRadius.all(Radius.circular(4)),
     borderSide: BorderSide(width: 1,color: Colors.green),
   ),
   border: OutlineInputBorder(
     borderRadius: BorderRadius.all(Radius.circular(4)),
     borderSide: BorderSide(width: 1,)
   ),
   errorBorder: OutlineInputBorder(
     borderRadius: BorderRadius.all(Radius.circular(4)),
     borderSide: BorderSide(width: 1,color: Colors.black)
   ),
   focusedErrorBorder: OutlineInputBorder(
     borderRadius: BorderRadius.all(Radius.circular(4)),
     borderSide: BorderSide(width: 1,color: Colors.yellowAccent)
   ),
   hintText: "HintText",
   hintStyle: TextStyle(fontSize: 16,color: Color(0xFFB3B1B1)),
   errorText: snapshot.error,
 ),
 controller: _passwordController,
 onChanged: _authenticationFormBloc.onPasswordChanged,
                            obscureText: false,
),

DisabledBorder:

DisabledBorder


enabledBorder:

enabledBorder

focusBorder:

focusBorder

errorBorder:

errorBorder

errorFocusedBorder:

errorFocusedBorder

希望对您有帮助。


13

代码中,你改变的颜色primaryColorprimaryColorDark不改变颜色inicial的边界,只有挖掘颜色黑色停留后

必须更改的属性是 hintColor

BorderSide 不应用于此目的,您需要更改主题。

要使红色默认为放置主题MaterialApp(theme: ...)并更改特定窗口小部件的主题(例如将窗口小部件的默认红色更改为黄色),请将该窗口小部件包围:

new Theme(
  data: new ThemeData(
    hintColor: Colors.yellow
  ),
  child: ...
)

下面是代码和gif:

请注意,如果我们将primaryColor颜色定义为黑色,则通过点击小部件将其选择为黑色

但是要更改小部件内的标签和文本,我们需要将主题设置为 InputDecorationTheme

以黄色开头的小部件具有自己的主题,以红色开头的小部件具有使用函数定义的默认主题 buildTheme()

在此处输入图片说明

import 'package:flutter/material.dart';

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

ThemeData buildTheme() {
  final ThemeData base = ThemeData();
  return base.copyWith(
    hintColor: Colors.red,
    primaryColor: Colors.black,
    inputDecorationTheme: InputDecorationTheme(
      hintStyle: TextStyle(
        color: Colors.blue,
      ),
      labelStyle: TextStyle(
        color: Colors.green,
      ),
    ),
  );
}

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

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => new _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String xp = '0';

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(),
      body: new Container(
        padding: new EdgeInsets.only(top: 16.0),
        child: new ListView(
          children: <Widget>[
            new InkWell(
              onTap: () {},
              child: new Theme(
                data: new ThemeData(
                  hintColor: Colors.yellow
                ),
                child: new TextField(
                  decoration: new InputDecoration(
                      border: new OutlineInputBorder(),
                      hintText: 'Tell us about yourself',
                      helperText: 'Keep it short, this is just a demo.',
                      labelText: 'Life story',
                      prefixIcon: const Icon(Icons.person, color: Colors.green,),
                      prefixText: ' ',
                      suffixText: 'USD',
                      suffixStyle: const TextStyle(color: Colors.green)),
                )
              )
            ),
            new InkWell(
              onTap: () {},                
              child: new TextField(
                decoration: new InputDecoration(
                    border: new OutlineInputBorder(
                      borderSide: new BorderSide(color: Colors.teal)
                    ),
                    hintText: 'Tell us about yourself',
                    helperText: 'Keep it short, this is just a demo.',
                    labelText: 'Life story',
                    prefixIcon: const Icon(Icons.person, color: Colors.green,),
                    prefixText: ' ',
                    suffixText: 'USD',
                    suffixStyle: const TextStyle(color: Colors.green)),
              )
            )
          ],
        ),
      )
    );
  }
}

Jannie Theunissen的答案(当前低于此答案)是最新的答案。
evensevens”,


5

最好,最有效的解决方案是在主类中添加主题,并像这样添加输入修饰。

theme: ThemeData(
    inputDecorationTheme: InputDecorationTheme(
        border: OutlineInputBorder(
           borderSide: BorderSide(color: Colors.pink)
        )
    ),
)

2
  1. 在您的lib文件中

  2. 创建一个名为的文件夹colors

  3. colors文件夹内创建一个dart文件并将其命名color

  4. 将此代码粘贴到其中

    const MaterialColor primaryOrange = MaterialColor(
        _orangePrimaryValue,
        <int, Color>{
            50: Color(0xFFFF9480),
            100: Color(0xFFFF9480),
            200: Color(0xFFFF9480),
            300: Color(0xFFFF9480),
            400: Color(0xFFFF9480),
            500: Color(0xFFFF9480),
            600: Color(0xFFFF9480),
            700: Color(0xFFFF9480),
            800: Color(0xFFFF9480),
            900: Color(0xFFFF9480),
        },
    );
    const int _orangePrimaryValue = 0xFFFF9480;
    
  5. 转到您的main.dart文件,然后将此代码放在主题中

    theme:ThemeData(
        primarySwatch: primaryOrange,
    ),
    
  6. 导入color文件夹中main.dart是这样import 'colors/colors.dart';


0

我们尝试了带有粘贴代码段的自定义搜索框。该代码将对TextFiledFlutter中的所有装饰有用。希望此片段对其他人有帮助。

Container(
        margin: EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 10.0),
        child:  new Theme(
          data: new ThemeData(
           hintColor: Colors.white,
            primaryColor: Colors.white,
            primaryColorDark: Colors.white,
          ),
          child:Padding(
          padding: EdgeInsets.all(10.0),
          child: TextField(
            style: TextStyle(color: Colors.white),
            onChanged: (value) {
              filterSearchResults(value);
            },
            controller: editingController,
            decoration: InputDecoration(
                labelText: "Search",
                hintText: "Search",
                prefixIcon: Icon(Icons.search,color: Colors.white,),
                enabled: true,
                enabledBorder: OutlineInputBorder(
                  borderSide: BorderSide(color: Colors.white),
                    borderRadius: BorderRadius.all(Radius.circular(25.0))),
                border: OutlineInputBorder(
                    borderSide: const BorderSide(color: Colors.white, width: 0.0),
                    borderRadius: BorderRadius.all(Radius.circular(25.0)))),
          ),
        ),
        ),
      ),
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.