如何在切换到下一个屏幕时避免键盘弹出?

3
当我从LoginScreen()导航到HomeScreen()时,键盘会在导航过程中突然弹出一小段时间,然后立即关闭,原因不明。
调用屏幕pushReplacement的函数:
    () async {
                      if (_formKey.currentState.validate()) {
                        final FirebaseAuth _auth = FirebaseAuth.instance;
                        try {
                          await _auth.signInWithEmailAndPassword(
                              email: email, password: password);
                        } catch (e) {
                          Scaffold.of(context).showSnackBar(SnackBar(
                            content: Text('Email or Password are incorrect'),
                          ));
                        }

                        _user = await _auth.currentUser();

                        if (_user == null) {}
                        if (_user.isEmailVerified == true) {
                          Navigator.of(context)
                              .pushReplacementNamed(HomeScreen.routeName);
                        } else
                          Scaffold.of(context).showSnackBar(SnackBar(
                            content: Text('Validate your email pls!'),
                          ));
                      }
                    },

和HomeScreen():

    import 'package:final_login/screens/loginscreen.dart';
    import 'package:final_login/services/auth.dart';
    import 'package:flutter/material.dart';

    class HomeScreen extends StatefulWidget {
      static const routeName = '/home-screen';
      @override
      _HomeScreenState createState() => _HomeScreenState();
    }

    class _HomeScreenState extends State<HomeScreen> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(),
          body: Center(
            child: Column(
              children: <Widget>[
                RaisedButton(
                  child: Text('Log out'),
                  onPressed: (){
                    AuthService().signOut();
                    Navigator.of(context).pushReplacementNamed(LoginScreen.routeName);
                  },
                ),

              ],
            ),
          ),
        );
      }
    }

在函数调用之前加上 FocusScope.of(context).requestFocus(FocusNode()); 即可解决问题。
2个回答

5

更新:

在Flutter更新后,下面的答案已经不再是最佳方法,现在更好的方式如下:

FocusScope.of(context).unfocus();

旧答案

尝试这个方法,在推送新页面之前,它将以编程方式删除键盘:

if (_user.isEmailVerified == true) {
  FocusScope.of(context).requestFocus(FocusNode());
  Navigator.of(context).pushReplacementNamed(HomeScreen.routeName);
}

注意:FocusNode()必须进行释放,以避免内存泄漏。 - Ali Bagheri

0

上面的答案对我没用。在导航之前尝试这段代码。

FocusScope.of(context).unfocus();

RaisedButton(
    onPressed: () {
    FocusScope.of(context).unfocus();
    Navigator.of(context).pushReplacement(
    MaterialPageRoute(
    builder: (context) => HomeScreen(),
                                    ),
                                  );
                                },
                              ),

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接