Skip to content
FlutterDocs

How to Change TextField Border Width, Radius and Border Color in Flutter

Verified Solution Tested on Flutter 3.47.7 • Dart 3.13.5
Jump to Updated Flutter Example ↓

In this example, we are going to show you the easiest way to change border widget, radius, and border color of TextField widget in Flutter. There may be many text field in the form, use the example below to style border of TextField with less code.

OutlineInputBorder myinputborder(){ //return type is OutlineInputBorder
  return OutlineInputBorder( //Outline border type for TextFeild
    borderRadius: BorderRadius.all(Radius.circular(20)),
    borderSide: BorderSide(
        color:Colors.redAccent,
        width: 3,
      )
  );
}

OutlineInputBorder myfocusborder(){
  return OutlineInputBorder(
    borderRadius: BorderRadius.all(Radius.circular(20)),
    borderSide: BorderSide(
        color:Colors.greenAccent,
        width: 3,
      )
  );
}

//create a function like this so that you can use it wherever you want multiple times

TextField( 
  decoration: InputDecoration( 
      labelText: "Username",
      border: myinputborder(), //normal border
      enabledBorder: myinputborder(), //enabled border
      focusedBorder: myfocusborder(), //focused border
      // set more border style like disabledBorder
  )
),

TextField( 
  decoration: InputDecoration( 
      labelText: "Password",
      enabledBorder: myinputborder(),
      focusedBorder: myfocusborder(),
  )
))

Full Code Example:

import 'package:flutter/material.dart';

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

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

class Home extends StatefulWidget{
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {

  TextEditingController username = TextEditingController();
  TextEditingController password = TextEditingController();
  @override
  void initState() {
    username.text = ""; //innitail value of text field
    password.text = "";
    super.initState();
  }
  
  @override
  Widget build(BuildContext context) {
    return  Scaffold(
          appBar: AppBar( 
             title: Text("Icons on TextField"),
             backgroundColor: Colors.deepOrangeAccent,
          ),
          body: Container(
            padding: EdgeInsets.all(20),
            child: Column( 
              children: [
                TextField( 
                  controller: username,
                  decoration: InputDecoration( 
                      labelText: "Username",
                      prefixIcon: Icon(Icons.people),
                      border: myinputborder(),
                      enabledBorder: myinputborder(),
                      focusedBorder: myfocusborder(),
                  )
                ),

                Container(height:20),

                TextField( 
                  controller: password,
                  decoration: InputDecoration( 
                      prefixIcon: Icon(Icons.lock),
                      labelText: "Password",
                      enabledBorder: myinputborder(),
                      focusedBorder: myfocusborder(),
                  )
                ),

              ],
            ),
          )
       );
  }

  OutlineInputBorder myinputborder(){ //return type is OutlineInputBorder
    return OutlineInputBorder( //Outline border type for TextFeild
      borderRadius: BorderRadius.all(Radius.circular(20)),
      borderSide: BorderSide(
          color:Colors.redAccent,
          width: 3,
        )
    );
  }

  OutlineInputBorder myfocusborder(){
    return OutlineInputBorder(
      borderRadius: BorderRadius.all(Radius.circular(20)),
      borderSide: BorderSide(
          color:Colors.greenAccent,
          width: 3,
        )
    );
  }

  //create a function like this so that you can use it wherever you want
}

Output Screenshot:

How to Change TextField Border Width, Radius and Border Color in Flutter screenshot

In this way, you can set Border size, border radius, and border color on TextField widget of Flutter. For comprehensive input decoration options, explore TextField hints and styling and setting icons on TextFields.

Updated Flutter Example
SDK: Flutter 3.47.7 • Dart 3.13.5 Verified on Flutter 3.47.7 (Stable)

Updated Flutter Example

InputDecoration Custom Border Architecture

Key Implementation Details & Modern Differences:

  • Multi-State Border Architecture: Distinctly configures enabledBorder, focusedBorder, and errorBorder to provide clear visual feedback across input states.
  • Consistent Radius Tokens: Uses unified BorderRadius.circular() across all border definitions to prevent shape snapping during focus transitions.
  • Material 3 Theme Compatibility: Integrates custom border definitions with color scheme tokens for dynamic light and dark theme adaptation.
Updated Flutter Example Code
import 'package:flutter/material.dart';

void main() {
  runApp(const MaterialApp(home: ModernTextFieldBorderDemo()));
}

class ModernTextFieldBorderDemo extends StatefulWidget {
  const ModernTextFieldBorderDemo({super.key});

  @override
  State<ModernTextFieldBorderDemo> createState() =>
      _ModernTextFieldBorderDemoState();
}

class _ModernTextFieldBorderDemoState extends State<ModernTextFieldBorderDemo> {
  final TextEditingController _controller = TextEditingController();
  double _borderRadius = 12.0;
  final double _borderWidth = 2.0;

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);

    return Scaffold(
      appBar: AppBar(title: const Text('TextField Border Styling')),
      body: SingleChildScrollView(
        padding: const EdgeInsets.all(20.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              'Custom Styled Input Field:',
              style: theme.textTheme.titleMedium,
            ),
            const SizedBox(height: 12),
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                labelText: 'Username or Email',
                hintText: 'Enter your account identifier',
                prefixIcon: const Icon(Icons.person_outline),
                enabledBorder: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(_borderRadius),
                  borderSide: BorderSide(
                    color: theme.colorScheme.outline,
                    width: _borderWidth,
                  ),
                ),
                focusedBorder: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(_borderRadius),
                  borderSide: BorderSide(
                    color: theme.colorScheme.primary,
                    width: _borderWidth + 1.0,
                  ),
                ),
                errorBorder: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(_borderRadius),
                  borderSide: BorderSide(
                    color: theme.colorScheme.error,
                    width: _borderWidth,
                  ),
                ),
              ),
            ),
            const SizedBox(height: 24),
            Row(
              children: [
                FilledButton.tonal(
                  onPressed: () => setState(() => _borderRadius = 24.0),
                  child: const Text('Pill Radius (24)'),
                ),
                const SizedBox(width: 12),
                FilledButton.tonal(
                  onPressed: () => setState(() => _borderRadius = 6.0),
                  child: const Text('Sharp Radius (6)'),
                ),
              ],
            ),
            const Divider(height: 36),
            Text(
              'Modern Architecture: Define enabledBorder and focusedBorder explicitly '
              'with identical border radiuses to prevent jarring shape shifts when users '
              'focus into the field. Color tokens should resolve dynamically from ColorScheme.',
              style: theme.textTheme.bodySmall?.copyWith(
                color: Colors.grey[700],
              ),
            ),
          ],
        ),
      ),
    );
  }
}
Document History & Archival Record

Original reference snapshot archived April 1, 2023. Updated working solution verified on modern Flutter & Dart SDKs.