Клавиатура Flutter OnScreen открывается при нажатии физической клавиши - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть устройство, которое использует лазерный сканер для сканирования штрих-кодов и выводит результат в виде смоделированных нажатий клавиш. Я использовал это с RawKeyboardListener, и он работал нормально. С тех пор я добавил в приложение экран входа в систему, который отображается только в том случае, если пользователь не вошел в систему. Если экран входа в систему отображен и расположен, экранная клавиатура открывается при нажатии кнопки физического сканера. Это не должно происходить и не происходит, если экран входа в систему не был показан. Я предполагаю, что после того, как он будет удален, все еще есть некоторые текстовые поля, используемые на экране входа в систему. Я попытался установить FocusNodes для текстовых полей и затем утилизировать их в методе dispose, но это не сработало

login.dart

  @override
  _LoginState createState() => _LoginState();
}

class _LoginState extends State<Login> {
  TextEditingController usernameController = TextEditingController();
  TextEditingController passwordController = TextEditingController();


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: background_epal_plattform_black,
      body: Padding(
        padding: const EdgeInsets.only(left: 30, right: 30),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            TextField(
              autofocus: false,
              controller: usernameController,
              cursorColor: colorAccent,
              textCapitalization: TextCapitalization.none,
              decoration: InputDecoration(
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(35),
                    borderSide: BorderSide(
                      width: 0,
                      style: BorderStyle.none,
                    ),
                  ),
                  fillColor: background_epal_plattform_black_1,
                  filled: true,
                  labelText: "Username",
                  labelStyle: TextStyle(
                      fontSize: 25, color: text_color_epal_navigation_white),
                  contentPadding: EdgeInsets.only(
                      left: 30, top: 20, bottom: 20, right: 10)),
              style: TextStyle(
                  color: text_color_epal_navigation_white, fontSize: 20),
            ),
            SizedBox(
              height: 30,
            ),
            TextField(
              autofocus: false,
              controller: passwordController,
              cursorColor: colorAccent,
              obscureText: true,
              decoration: InputDecoration(
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(35),
                  borderSide: BorderSide(
                    width: 0,
                    style: BorderStyle.none,
                  ),
                ),
                fillColor: background_epal_plattform_black_1,
                filled: true,
                labelText: "Password",
                labelStyle: TextStyle(
                    fontSize: 25, color: text_color_epal_navigation_white),
                contentPadding:
                    EdgeInsets.only(left: 30, top: 20, bottom: 20, right: 10),
                errorText: Provider.of<LoginModel>(context).error ?? "",
                errorStyle: TextStyle(fontSize: 20, color: colorAccent),
              ),
              style: TextStyle(
                  color: text_color_epal_navigation_white, fontSize: 20),
            ),
            SizedBox(
              height: 30,
            ),
            CustomButton(
              pressed: false,
              showProgress: false,
              onPressed: () async {
                if (usernameController.text.isNotEmpty &&
                    passwordController.text.isNotEmpty) {
                  var isOK = await Provider.of<LoginModel>(context,
                          listen: false)
                      .login(usernameController.text, passwordController.text);
                  if (isOK) {
                    FocusScope.of(context).unfocus();
                    Navigator.of(context).pushNamedAndRemoveUntil("home", (route) => false);
                  }
                }
              },
              text: "Login",
            )
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    usernameController.dispose();
    passwordController.dispose();
    super.dispose();
  }
}

home.dart

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage>
    with SingleTickerProviderStateMixin {
  AnimationController rotationController;
  int easterEggTaps = 0;
  bool bottomSheetOpen = false;
  FocusNode scannerNode = FocusNode();

  @override
  void initState() {
    super.initState();
    rotationController = AnimationController(
        duration: const Duration(milliseconds: 1000), vsync: this);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: background_epal_plattform_black,
      body: Consumer<HomeModel>(
        builder: (BuildContext context, HomeModel model, Widget child) {
          return RawKeyboardListener(
            focusNode: scannerNode,
            onKey: (keyevent) {
              model.keyPress(keyevent);
            },
            autofocus: true,
            child: child
          );
        },
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...