When I select a Textfield the keyboard moves over it

后端 未结 10 707
渐次进展
渐次进展 2020-12-03 05:51

When i select a Textfield, the keyboard is going to be shown but the keyboard hide my selected TextField. Does someone have a solution?

10条回答
  •  旧巷少年郎
    2020-12-03 06:33

    Compose an animation and move your TextField container up when a TextField gets focus.

    For learning about composing animations refer to: Composing Animations and Chaining Animations in Dart's Flutter Framework

    Use Flutter's FocusNode to detect the focus on a TextField

    Edit:

    Here I've written an example that does exactly what you want:

    import 'package:flutter/material.dart';
    
    void main() => runApp(new MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          debugShowCheckedModeBanner: false,
          title: 'Animation Demo',
          theme: new ThemeData(
            primaryColor: new Color(0xFFFF0000),
          ),
          home: new FormDemo(),
        );
      }
    }
    
    class FormDemo extends StatefulWidget {
      @override
      _FormDemoState createState() => _FormDemoState();
    }
    
    class _FormDemoState extends State with SingleTickerProviderStateMixin {
      AnimationController _controller;
      Animation _animation;
    
      FocusNode _focusNode = FocusNode();
    
      @override
      void initState() {
        super.initState();
    
        _controller = AnimationController(vsync: this, duration: Duration(milliseconds: 300));
        _animation = Tween(begin: 300.0, end: 50.0).animate(_controller)
        ..addListener(() {
          setState(() {});
        });
    
        _focusNode.addListener(() {
          if (_focusNode.hasFocus) {
            _controller.forward();
          } else {
            _controller.reverse();
          }
        });
      }
    
      @override
      void dispose() {
        _controller.dispose();
        _focusNode.dispose();
    
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          resizeToAvoidBottomPadding: false, // this avoids the overflow error
          appBar: AppBar(
            title: Text('TextField Animation Demo'),
          ),
          body: new InkWell( // to dismiss the keyboard when the user tabs out of the TextField
            splashColor: Colors.transparent,
            onTap: () {
              FocusScope.of(context).requestFocus(FocusNode());
            },
            child: Container(
              padding: const EdgeInsets.all(20.0),
              child: Column(
                children: [
                  SizedBox(height: _animation.value),
                  TextFormField(
                    decoration: InputDecoration(
                      labelText: 'I move!',
                    ),
                    focusNode: _focusNode,
                  )
                ],
              ),
            ),
          ),
        );
      }
    }
    

提交回复
热议问题