У меня есть устройство, которое использует лазерный сканер для сканирования штрих-кодов и выводит результат в виде смоделированных нажатий клавиш. Я использовал это с 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
);
},
),
);
}
}