【问题标题】:unfocus doesn't work when split widget to another file将小部件拆分到另一个文件时,unfocus 不起作用
【发布时间】:2022-01-24 13:13:32
【问题描述】:

我有 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 (Scaffold) 放入 main.dart 时,它是有效的,(我说有效,因为 android 键盘在从文本字段中失焦时会消失)

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
      ),
    );
  }
}

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

【问题讨论】:

    标签: flutter dart widget


    【解决方案1】:

    将您的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 函数中使用。与您之前使用的(来自 build 方法参数)相比,这个新的上下文包含有关小部件树中位置的更具体的详细信息。

    【讨论】:

    • 谢谢它的工作,我想知道它是否也适用于嵌套小部件。我应该每次都创建构建器吗?我对嵌套小部件的意思是,part of 'main.dart'; class CustomInput extends StatelessWidget { const HomePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return TextField(style: TextStyle(color: Colors.red)); } } 然后在 home_page.dart 调用 CustomInput
    • 我认为在大多数情况下你应该很好,不用Builder。您帖子中的案例非常具体,因为它影响了您的应用程序的一开始,因此从MyApp 构建方法获得的BuildContext 是“太差” - 它上面没有任何小部件。此外,GestureDetector 小部件高于MaterialApp。如果MaterialApp 上面没有任何与 UI 相关的小部件,那可能会更好,因为MaterialApp 是您应用程序 UI 部分的开始
    猜你喜欢
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多