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:

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
Updated Flutter Example
InputDecoration Custom Border Architecture
Key Implementation Details & Modern Differences:
- Multi-State Border Architecture: Distinctly configures
enabledBorder,focusedBorder, anderrorBorderto 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.