Flutter: Möglichkeit, den Tastaturfokus aus dem gesamten Baum zu entfernen

Erstellt am 1. Feb. 2018  ·  1Kommentar  ·  Quelle: flutter/flutter

Schritte zum Reproduzieren

Ich möchte den hintText eines textField anzeigen, bis der Benutzer irgendwo anders berührt.
Der Touchpoint könnte sich tief im Widget-Baum befinden und ich weiß nicht, wie ich den aktuellen fokussierten Knoten irgendwo im Widget-Baum abrufen kann, um unfocused aufzurufen, das textField inaktiv anzuzeigen und die Tastatur auszublenden. Dies könnte nur ein Problem mit meinem Verständnis von Flattern oder der Dokumentation sein, die kein Beispiel enthält und die Verwendung der Muster nicht erklärt.

Das Codebeispiel zeigt den GestureDetector, der Unfocus für den Knoten aufruft. Dies ist hier einfach, da der focusNode im selben Widget leicht zugänglich ist. Die Frage hier ist, wie Sie dasselbe in einem verschachtelten Widget-Baum tun können. Was ist das empfohlene Muster dafür?

  <strong i="9">@override</strong>
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Text(widget.title),
        ),
        body: new Stack(children: <Widget>[
          new GestureDetector(
              excludeFromSemantics: true,
              onTapDown: (_) {
                _focusNode.unfocus();
              }),
          new Column(children: <Widget>[
            new TextField(
                focusNode: _focusNode,
                decoration: new InputDecoration(
                    border: null,
                    hintText: _focusNode.hasFocus ? 'FOCUS' : 'no focus')),
            new RaisedButton(
                child: new Text('Remove Focus'),
                onPressed: () => _focusNode.unfocus())
          ])
        ]));
  }

  final FocusNode _focusNode = new FocusNode();

  <strong i="10">@override</strong>
  void initState() {
    super.initState();
    _focusNode.addListener(() {
      setState(() {});
      print('Has focus: $_focusNode.hasFocus');
    });
  }

Flutter Doktor

[√] Flutter (on Microsoft Windows [Version 10.0.16299.192], locale en-US, channel dev)
    • Flutter version 0.0.21 at c:\sdks\flutter
    • Framework revision 2e449f06f0 (2 days ago), 2018-01-29 14:26:51 -0800
    • Engine revision 6921873c71
    • Tools Dart version 2.0.0-dev.16.0
    • Engine Dart version 2.0.0-edge.da1f52592ef73fe3afa485385cb995b9aec0181a

[√] Android toolchain - develop for Android devices (Android SDK 27.0.2)
    • Android SDK at C:\Users\ride4\AppData\Local\Android\sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-27, build-tools 27.0.2
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-915-b01)

[√] Android Studio (version 3.0)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-915-b01)

[√] IntelliJ IDEA Community Edition (version 2017.2)
    • Flutter plugin version 19.1
    • Dart plugin version 172.4343.25

[√] Connected devices
    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 7.1.1 (API 25) (emulator)
look material design framework new feature

Hilfreichster Kommentar

Ich denke, das läuft darauf hinaus

FocusScope.of(context).requestFocus(new FocusNode());

Schließung als Duplikat von #7247
vielleicht auch #20227

>Alle Kommentare

Ich denke, das läuft darauf hinaus

FocusScope.of(context).requestFocus(new FocusNode());

Schließung als Duplikat von #7247
vielleicht auch #20227

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen