import 'package:flutter/material.dart'; class TestPage extends StatefulWidget { TestPage({Key key, this.title = "Input Test"}) : super(key: key); final String title; @override _TestPageState createState() => _TestPageState(); } class _TestPageState extends State<TestPage> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override void initState() { // TODO: implement initState super.initState(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: SafeArea( bottom: false, child: ListView( children: <Widget>[ Container( child: Text( 'You have pushed the button this many times:', ), margin: const EdgeInsets.all(8.0), alignment: Alignment.center, ), Container( child: Text( '$_counter', style: Theme.of(context).textTheme.display1, ), margin: const EdgeInsets.all(8.0), alignment: Alignment.center, ), Container( child: TextField( minLines: 2, maxLines: 10, ), padding: const EdgeInsets.all(8.0), ), TestTextField(), Container( child: Container( color: Colors.red, width: double.infinity, height: 128.0, ), padding: const EdgeInsets.all(8.0), ), Container( child: Container( color: Colors.orange, width: double.infinity, height: 128.0, ), padding: const EdgeInsets.all(8.0), ), Container( child: Container( color: Colors.green, width: double.infinity, height: 128.0, ), padding: const EdgeInsets.all(8.0), ), Container( child: Container( color: Colors.blue, width: double.infinity, height: 128.0, ), padding: const EdgeInsets.all(8.0), ), Container( child: Container( color: Colors.yellow, width: double.infinity, height: 128.0, ), padding: const EdgeInsets.all(8.0), ), Container( child: TextField( minLines: 2, maxLines: 10, ), padding: const EdgeInsets.all(8.0), ), TestTextField(), ], )), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), ), // This trailing comma makes auto-formatting nicer for build methods. ); } } class TestTextField extends StatefulWidget { @override _TestTextFieldState createState() => _TestTextFieldState(); } class _TestTextFieldState extends State<TestTextField> { FocusNode _node; PersistentBottomSheetController _controller; @override void initState() { // TODO: implement initState super.initState(); _node = FocusNode(); _node.addListener(() { if (_node.hasFocus) { print('showBottomSheet'); _controller = Scaffold.of(context) .showBottomSheet<dynamic>((BuildContext ctx) => Container( width: double.infinity, height: 36.0, color: Colors.deepPurple, )); } else { if (_controller != null) { //Navigator.of(context).pop(); print('closeBottomSheet'); _controller.close(); } _controller = null; } }); } @override Widget build(BuildContext context) { return Container( child: TextField( minLines: 2, maxLines: 10, focusNode: _node, ), padding: const EdgeInsets.all(8.0), ); } }