flutter - 您将如何从这个小部件树创建一个独立的小部件?

标签 flutter

我有这个小部件树代表一个简单的数据选择器表单字段:

GestureDetector(
  onTap: () => _showDataPicker(context),
  child: AbsorbPointer(
    absorbing: true,
    child: TextFormField(
        controller: _controller,
        decoration: new InputDecoration(
            border: OutlineInputBorder(
                borderRadius: BorderRadius.circular(20)),
            suffixIcon: Icon(Icons.lock_open),
            icon: Icon(Icons.lock),
            hintText: "Password"),
        validator: (String value) {
          return null;
          if (value.isEmpty)
            return "Password can't be empty";
          else if (value.length < 8)
            return "Password must contain at least 8 chars";

          return null;
        }),
  ),
),

它只是一个被 AbsorbPointer 包围的文本表单字段,用于禁用其上的输入。从该代码我想创建一个自定义小部件,我可以将其插入小部件树的任何其他部分。像这样:

CustomFormDataPicker(
    validator: (value) {},
)

你会怎么做?您会从 FormField 继承吗(因为我希望它始终在表单中使用)。您是否会继承顶级组件 GestureDetector 并保留对 TextFormField 的引用(不知道这将如何与父表单一起使用)?

我有点迷茫。非常感谢任何帮助。

最佳答案

检查这段代码。如果您需要进一步的解释,请随时告诉我。

import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(home: HomePage()));

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Material(
      child: CustomFormDataPicker(
        validator: (String value) {
          // return null;
          if (value.isEmpty)
            return "Password can't be empty";
          else if (value.length < 8)
            return "Password must contain at least 8 chars";

          return null;
        },
      ),
    );
  }

}

typedef ShowDataPickerCallback = void Function(BuildContext context);

class CustomFormDataPicker extends StatelessWidget {
  final String Function(String message) validator;
  final ShowDataPickerCallback showDataPicker;

  CustomFormDataPicker({this.validator, this.showDataPicker});

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () => showDataPicker != null ? showDataPicker(context) : null,
      child: AbsorbPointer(
        absorbing: true,
        child: TextFormField(
            controller: _controller,
            decoration: new InputDecoration(
                border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(20)),
                suffixIcon: Icon(Icons.lock_open),
                icon: Icon(Icons.lock),
                hintText: "Password"),
            validator: validator),
      ),
    );
  }
}

关于flutter - 您将如何从这个小部件树创建一个独立的小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56589019/

相关文章:

flutter - 在 flutter 中的两个页面之间导航时出现黑屏

Flutter:导航到不同屏幕上的特定选项卡

android - 如何在flutter中使用rewarded video listener?

Flutter-Getx : How do I update New Date Selected in Getx dialog box?

flutter - 即使配置了Android Studio,如何解决NDK丢失的问题?

Flutter(IOS)内购本地收据

flutter - 为什么我的 PopupMenuItem 上会出现 "Looking up a deactivated widget' 的祖先不安全”?

flutter - 如何热重载状态字段?

android - 如何隐藏 Flutter Stepper 上的继续和取消按钮

windows - flutter 3.3 ShaderCompilerException ink_sparkle.frag 失败,退出代码为 -1073740791