将小部件拆分到另一个文件时,unfocus 不起作用

unfocus doesn't work when split widget to another file

我有main.dart

part 'home_page.dart';
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  static const String _judul = 'Private Chat';

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        FocusScope.of(context).unfocus();
      },
      child: MaterialApp(
        title: _judul,
        home: HomePage(), // Using separated file
      ),
    );
  }
}

和home_page.dart

part of 'main.dart';
class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: TextField(),
    );
  }
}
当我将小部件从 main.dart 拆分到另一个文件(在本例中为 home_page.dart)时,

FocusScope.of(context).unfocus() 不起作用,因此项目会很整洁。

但是,当我直接将 HomePage() return(脚手架)放到 main.dart 时,它是有效的(我说有效是因为 android keybord 在文本字段未聚焦时消失)

part 'home_page.dart';
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  static const String _judul = 'Private Chat';

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        FocusScope.of(context).unfocus();
      },
      child: MaterialApp(
        title: _judul,
        home: Scaffold(...), //Directly put textfield
      ),
    );
  }
}

我怀疑这是上下文错误,我不知道上下文属性和方法。

将你的 GestureDetector 放在 MaterialApp 下(交换它们)并用 Builder 包裹起来,像这样:

 class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  static const String _judul = 'Private Chat';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: _judul,
      home: Builder(
        builder: (context) {
          return GestureDetector(
            onTap: () {
              FocusScope.of(context).unfocus();
            },
            child: HomePage(),
          );
        },
      ),
    );
  }
}

之所以有效,是因为 Builder 为您提供了新的上下文,该上下文在 GestureDetectoronTap 函数中使用。这个新上下文包含比您之前使用的那个(来自构建方法参数)更具体的关于小部件树中位置的详细信息。