【问题标题】:Refocus TextField after dismissing Drawer关闭 Drawer 后重新聚焦 TextField
【发布时间】:2019-08-22 13:08:59
【问题描述】:

当用户关闭抽屉时,我想将焦点返回到 TextField。在此处的示例应用程序中(取自 https://flutter.dev/docs/cookbook/design/drawer 并稍作修改)有一个 TextField 具有焦点。打开抽屉,然后通过点击它旁边的来关闭抽屉,但TextField 上的焦点已经消失。

如何将焦点返回到TextField

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  final appTitle = 'Drawer Demo';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: appTitle,
      home: MyHomePage(title: appTitle),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String title;

  MyHomePage({Key key, this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(title)),
      body: Center(child: TextField(autofocus: true)),
      drawer: Drawer(
        // Add a ListView to the drawer. This ensures the user can scroll
        // through the options in the drawer if there isn't enough vertical
        // space to fit everything.
        child: ListView(
          // Important: Remove any padding from the ListView.
          padding: EdgeInsets.zero,
          children: <Widget>[
            DrawerHeader(
              child: Text('Drawer Header'),
              decoration: BoxDecoration(
                color: Colors.blue,
              ),
            ),
            ListTile(
              title: Text('Item 1'),
              onTap: () {
                // Update the state of the app
                // ...
                // Then close the drawer
                Navigator.pop(context);
              },
            ),
            ListTile(
              title: Text('Item 2'),
              onTap: () {
                // Update the state of the app
                // ...
                // Then close the drawer
                Navigator.pop(context);
              },
            ),
          ],
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart navigation-drawer textfield


    【解决方案1】:

    使用FocusNode 和自定义Drawer 小部件:

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      final appTitle = 'Drawer Demo';
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: appTitle,
          home: MyHomePage(title: appTitle),
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
      final String title;
    
      MyHomePage({Key key, this.title}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
    
        FocusNode fieldNode = FocusNode();
    
        return Scaffold(
          appBar: AppBar(title: Text(title)),
          body: Center(
              child: Container(
                width: 150.0,
                child: TextField(autofocus: true,focusNode: fieldNode,)
              ),
          ),
          drawer: CustomDrawer(node: fieldNode,),
        );
      }
    }
    
    class CustomDrawer extends StatefulWidget {
    
      final FocusNode node ;
    
      CustomDrawer({Key key,this.node}): super(key: key);
    
      @override
      _CustomDrawerState createState() => _CustomDrawerState();
    }
    
    class _CustomDrawerState extends State<CustomDrawer> {
    
      @override
      void initState() {
        super.initState();
        widget.node.unfocus();
      }
    
      @override
      void dispose() {
        widget.node.requestFocus();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Drawer(
          // Add a ListView to the drawer. This ensures the user can scroll
          // through the options in the drawer if there isn't enough vertical
          // space to fit everything.
          child: ListView(
            // Important: Remove any padding from the ListView.
            padding: EdgeInsets.zero,
            children: <Widget>[
              DrawerHeader(
                child: Text('Drawer Header'),
                decoration: BoxDecoration(
                  color: Colors.blue,
                ),
              ),
              ListTile(
                title: Text('Item 1'),
                onTap: () {
                  // Update the state of the app
                  // ...
                  // Then close the drawer
                  Navigator.pop(context);
                },
              ),
              ListTile(
                title: Text('Item 2'),
                onTap: () {
                  // Update the state of the app
                  // ...
                  // Then close the drawer
                  Navigator.pop(context);
                },
              ),
            ],
          ),
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多