Флаттер: фокус не работает в режиме выпуска

#flutter #flutter-desktop

Вопрос:

Я создаю настольное приложение flutter, и события клавиатуры не обнаруживаются FocusScope в режиме выпуска. В режиме отладки все работает нормально. Есть идеи, как я могу заставить это работать правильно?

Может быть, я могу дать своему клиенту папку отладки, так как она работает нормально, а не выпуск. Существуют ли какие-либо существенные различия, помимо размера? Кажется, я не могу определить что-либо заметное, так как обе версии загружаются быстро.

Мой код ниже:

 import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(

      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  int counter = 0;
  late FocusNode _focusNode;

  @override
  dispose() {
    _focusNode.dispose();
  }

  @override
  void initState() {
    _focusNode = FocusNode();
  }

    @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text("Test App"),
      ),
      body: Center(
        // Center is a layout widget. It takes a single child and positions it
        // in the middle of the parent.
        child: Column(

          children: <Widget>[
            Text(
              counter.toString(),
            ),
            FocusScope(
                child: TextField(),
                onKey: (_focusNode, event) {
                  if (event.toString().contains('RawKeyDownEvent') amp;amp; event.toString().contains('Arrow Up')) {
                    print(event.toString());
                    setState(() {
                      counter--;
                    }
                    );
                    return KeyEventResult.handled;
                  }
                  if (event.toString().contains('RawKeyDownEvent') amp;amp; event.toString().contains('Arrow Down')) {
                    print(event.toString());
                    setState(() {
                      counter  ;
                    }
                    );
                    return KeyEventResult.handled;
                  }
                  if (event.toString().contains('RawKeyDownEvent') amp;amp; event.toString().contains('Arrow Up')) {
                    print(event.toString());
                    setState(() {
                      counter--;
                    }
                    );
                    return KeyEventResult.handled;
                  }
                  return KeyEventResult.ignored;
                }

            ),

          ],
        ),
      ),
    );
  }
}
 

Комментарии:

1. скорее всего, это из-за этих сложных event.toString().contains вызовов, проверьте RawKeyEvent официальную документацию API, чтобы узнать, как получить конкретный ключ от события

2. @pskink Большое спасибо. Я переоделся if (event.runtimeType == RawKeyUpEvent amp;amp; event.logicalKey == LogicalKeyboardKey.arrowUp) {} и, кажется, теперь нормально работаю. Не уверен, что это правильный путь, так как я думаю, что читал о потенциальных проблемах с использованием event.RuntimeType раньше.

3. более естественным является if (event is RawKeyUpEvent amp;amp; ...

4. @pskink Работает идеально. Спасибо!

5. конечно, добро пожаловать