在 Flutter/Dart 中处理单独的文件

Working With Seperate Files in Flutter/Dart

我是 Dart 的新手,OOP.I 有一个 input.dart 文本表单字段文件和 login.dart 文件来执行 login.My 问题是我想访问文本控制器(位于 input.dart)来自 login.dart.

我创建了 getter 方法来获取 (controller.text) 数据,但我遇到了初始化错误。

如何从另一个文件访问控制器文本(基本上是用户输入)?

input.dart

class InputAlanState extends State<InputAlan> {
  late TextEditingController _emailKontroller;
  late TextEditingController _sifreKontroller;

  @override
  void initState() {
    super.initState();
    _emailKontroller = TextEditingController();
    _sifreKontroller = TextEditingController();
  }

  @override
  void dispose() {
    _emailKontroller.dispose();
    _sifreKontroller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (widget.tur == "email") {
      return Padding(
        padding: const EdgeInsets.only(top: 50, left: 20, right: 20),
        child: TextFormField(
          controller: _emailKontroller,
          autofocus: true,
          decoration: const InputDecoration(
              labelText: "E - Mail",
              hintText: "E-Mail",
              prefixIcon: Icon(Icons.email_outlined),
              suffixIcon: Icon(Icons.lock),
              border: OutlineInputBorder(
                  borderRadius: BorderRadius.all(Radius.circular(20.0)))),
        ),
      );
    } else if (widget.tur == "sifre") {
      return Padding(
        padding:
            const EdgeInsets.only(top: 40, left: 20, right: 20, bottom: 15),
        child: TextFormField(
          controller: _sifreKontroller,
          obscureText: true,
          decoration: const InputDecoration(
              labelText: "Password",
              hintText: "Password",
              prefixIcon: Icon(Icons.password_sharp),
              suffixIcon: Icon(Icons.lock),
              border: OutlineInputBorder(
                  borderRadius: BorderRadius.all(Radius.circular(20.0)))),
        ),
      );
    } else {
      return Padding(
        padding: const EdgeInsets.only(top: 50, left: 20, right: 20),
        child: TextFormField(
          decoration: const InputDecoration(
              labelText: "E - Mail",
              hintText: "E-Mail",
              prefixIcon: Icon(Icons.email_outlined),
              suffixIcon: Icon(Icons.lock),
              border: OutlineInputBorder(
                  borderRadius: BorderRadius.all(Radius.circular(20.0)))),
        ),
      );
    }
  }
}

login.py

 Widget build(BuildContext context) {
    return OutlinedButton(
      onPressed: () {
        InputAlan inputAlan = InputAlan("email");
        String email = inputAlan.email;
        String password = inputAlan.sifre;
        Login login = login(email, sifre);
        girisYap.girisYap(context);
      },
      child: const Text("SIGN IN"),
      style: OutlinedButton.styleFrom(
          primary: const Color(0xFF166FC0),
          side: const BorderSide(color: Color(0xFF0FA9EA), width: 2),
          shape: const RoundedRectangleBorder(
              borderRadius: BorderRadius.all(Radius.circular(10)))),
    );
  }
}

从另一个状态访问变量(在你的情况下从 InputAlanState)在 flutter 中你有多种选择,最简单的方法是使用 GlobalKey,所以在你的代码中你可以访问InputAlanState 的控制器来自您的 login 您可以在您的 OutlinedButton 中使用此代码:

 GlobalKey<InputAlanState> myKey = GlobalKey();

 myKey.currentState!._emailKontroller; //here

您正在将小部件放入函数参数中。通过这种方式,小部件无法呈现并且无法工作。我建议你看看 how to build flutter layouts 来掌握基础知识。 你可能想构建这样的东西:

enum Field { mail, password }

class MyApp extends StatelessWidget {

  final TextEditingController mailController = TextEditingController();
  final TextEditingController passwordController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          body: Column(
            children: [
              InputAlan(fieldType: Field.mail, textEditingController: mailController,),
              InputAlan(fieldType: Field.password, textEditingController: passwordController,),
              OutlinedButton(
                onPressed: () {
                   String email = mailController.text;
                   String sifre = passwordController.text;
                  // Login login = login(email, sifre);
                  // girisYap.girisYap(context);
                },
                child: const Text("SIGN IN"),
                style: OutlinedButton.styleFrom(
                    primary: const Color(0xFF166FC0),
                    side: const BorderSide(color: Color(0xFF0FA9EA), width: 2),
                    shape: const RoundedRectangleBorder(
                        borderRadius: BorderRadius.all(Radius.circular(10)))),
              ),
            ],
          )
      ),
    );
  }
}

TextField 小部件

class InputAlan extends StatefulWidget {
  const InputAlan({
    Key? key,
    required this.fieldType,
    required this.textEditingController,
  }) : super(key: key);

  final Field fieldType;
  final TextEditingController textEditingController;

  @override
  State<InputAlan> createState() => _InputAlanState();
}

class _InputAlanState extends State<InputAlan> {
  @override
  Widget build(BuildContext context) {
    final isMailField = widget.fieldType == Field.mail;
    return Padding(
      padding: const EdgeInsets.only(top: 50, left: 20, right: 20),
      child: TextFormField(
        controller: widget.textEditingController,
        autofocus: widget.fieldType == Field.mail,
        obscureText: !isMailField,
        decoration: InputDecoration(
            labelText: isMailField ? "E - Mail" : "Password",
            hintText: isMailField ? "E-Mail" : "Password",
            prefixIcon:
                Icon(isMailField ? Icons.email_outlined : Icons.password_sharp),
            suffixIcon: const Icon(Icons.lock),
            border: const OutlineInputBorder(
              borderRadius: BorderRadius.all(Radius.circular(20.0)),
            )),
      ),
    );
  }
}