Use a TextPainter to calculate the width of your text. Use a GlobalKey to get the size of your widget (A LayoutBuilder might be better to handle screen rotation).
import 'package:flutter/material.dart'; main() => runApp(MaterialApp(home: Home())); class Home extends StatefulWidget { @override _HomeState createState() => _HomeState(); } const textFieldPadding = EdgeInsets.all(8.0); const textFieldTextStyle = TextStyle(fontSize: 30.0); class _HomeState extends State<Home> { final TextEditingController _controller = TextEditingController(); final GlobalKey _textFieldKey = GlobalKey(); double _textWidth = 0.0; double _fontSize = textFieldTextStyle.fontSize; @override void initState() { super.initState(); _controller.addListener(_onTextChanged); } void _onTextChanged() { // substract text field padding to get available space final inputWidth = _textFieldKey.currentContext.size.width - textFieldPadding.horizontal; // calculate width of text using text painter final textPainter = TextPainter( textDirection: TextDirection.ltr, text: TextSpan( text: _controller.text, style: textFieldTextStyle, ), ); textPainter.layout(); var textWidth = textPainter.width; var fontSize = textFieldTextStyle.fontSize; // not really efficient and doesn't find the perfect size, but you got all you need! while (textWidth > inputWidth && fontSize > 1.0) { fontSize -= 0.5; textPainter.text = TextSpan( text: _controller.text, style: textFieldTextStyle.copyWith(fontSize: fontSize), ); textPainter.layout(); textWidth = textPainter.width; } setState(() { _textWidth = textPainter.width; _fontSize = fontSize; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Autosize TextField'), ), body: Padding( padding: EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: <Widget>[ TextField( key: _textFieldKey, controller: _controller, decoration: InputDecoration( border: InputBorder.none, fillColor: Colors.orange, filled: true, contentPadding: textFieldPadding, ), style: textFieldTextStyle.copyWith(fontSize: _fontSize), ), Text('Text width:'), Container( padding: textFieldPadding, color: Colors.orange, child: Row( children: <Widget>[ Container(width: _textWidth, height: 20.0, color: Colors.blue), ], ), ) ], ), ), ); } }