Flutter设置文本字段光标在更改控制器文本时启动

达蒙

我有一个可重用的文本字段类,如下所示:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String value = "";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: MyTextField(
            value: value,
            onChange: (val) {
              setState(() {
                value = val;
              });
            },
          ),
        ),
      ),
    );
  }
}

typedef ChangeCallback = void Function(String value);

class MyTextField extends StatefulWidget {
  final ChangeCallback onChange;
  final String value;

  const MyTextField({this.onChange = _myDefaultFunc, this.value = ""});
  
  static _myDefaultFunc(String value){}

  @override
  _MyTextFieldState createState() => _MyTextFieldState();
}

class _MyTextFieldState extends State<MyTextField> {
  final controller = TextEditingController();

  @override
  void initState() {
    controller.text = widget.value;
    super.initState();
  }

  @override
  void didUpdateWidget(covariant MyTextField oldWidget) {
    controller.text = widget.value;
    super.didUpdateWidget(oldWidget);
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: controller,
      onChanged: (value) {
        widget.onChange(value);
      },
    );
  }
}

如您所见,如果更改了值,则会onChange调用callback并将该值再次发送回TextField问题是每次我更新值时,TextField总是将光标设置为开始。可能是因为更新后的值TextField每次都发送回去了吗?不确定。你能帮我吗?

哈韦迪沙克

无需更新didUpdateWidget中的值

//@override
//   void didUpdateWidget(covariant MyTextField oldWidget) {
//     controller.text = widget.value;
//     super.didUpdateWidget(oldWidget);
//   }

我刚刚注释掉了此功能,下面的代码工作正常,是完整的代码

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String value = "";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Column(children: [
          SizedBox(height:50),
          Text("text input: $value"),
          SizedBox(height:50),
          Center(
            child: MyTextField(
              value: value,
              onChange: (val) {
                setState(() {
                  value = val;
                });
              },
            ),
          ),
        ]),
      ),
    );
  }
}

typedef ChangeCallback = void Function(String value);

class MyTextField extends StatefulWidget {
  final ChangeCallback onChange;
  final String value;

  const MyTextField({this.onChange = _myDefaultFunc, this.value = ""});

  static _myDefaultFunc(String value) {}

  @override
  _MyTextFieldState createState() => _MyTextFieldState();
}

class _MyTextFieldState extends State<MyTextField> {
  final controller = TextEditingController();

  @override
  void initState() {
    controller.text = widget.value;
    super.initState();
  }

//   @override
//   void didUpdateWidget(covariant MyTextField oldWidget) {
//     controller.text = widget.value;
//     super.didUpdateWidget(oldWidget);
//   }

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: controller,
      onChanged: (value) {
        widget.onChange(value);
      },
    );
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JavaFX将文本字段从当前控制器设置为下一个控制器

来自分类Dev

控制器加载数据时如何禁用emberJS中的文本字段

来自分类Dev

点击文本字段时如何显示视图控制器?

来自分类Dev

当我在视图控制器中移动时保存文本字段中的值

来自分类Dev

为什么这个视图控制器不能设置下一个视图控制器的文本字段?

来自分类Dev

当在两个文本字段之间更改光标时,Angular JS会收到警报

来自分类Dev

QML:更改文本字段中的光标颜色

来自分类Dev

切换浏览器选项卡时使光标不选择文本字段

来自分类Dev

在Oracle ApEx中更改其他文本项时设置文本字段的显示值

来自分类Dev

ms access-将光标在文本字段中的位置设置为仅在文本框为空时开始

来自分类Dev

我应该如何向表视图控制器添加文本字段/按钮?

来自分类Dev

Laravel文本字段表单占位符,使用来自控制器的数据

来自分类Dev

您如何在查看控制器代码中获得文本字段输入?

来自分类Dev

将值从输入文本字段传递到控制器

来自分类Dev

从视图页面获取文本字段值到控制器页面

来自分类Dev

如何在表视图控制器中放置文本字段以读取内容

来自分类Dev

iOS视图控制器中的文本字段自定义

来自分类Dev

快速从其他视图控制器调用文本字段(prepareforsegue)

来自分类Dev

无法在控制器中获取多个文本字段值

来自分类Dev

在警报控制器隐藏之前检查文本字段中的值 - iOS swift

来自分类Dev

在第一个视图控制器的标签中显示输入到文本字段(在第二个视图控制器中)的文本?

来自分类Dev

控制器可以从Rails应用程序的视图中获取文本字段,该字段是通过循环生成的:

来自分类Dev

文本字段上的抖动光标位置

来自分类Dev

iOS文本字段光标位置错误

来自分类Dev

当用户更改文本字段时,ipyvuetify捕获文本字段的用户输入值

来自分类Dev

设置片段的文本字段

来自分类Dev

如何将第二个视图控制器文本字段值传递给第一个视图控制器数组并在 swift4 中点击按钮时关闭

来自分类Dev

Flutter –如何设置电话号码文本字段的格式

来自分类Dev

重新渲染视图时如何控制文本字段焦点?

Related 相关文章

  1. 1

    JavaFX将文本字段从当前控制器设置为下一个控制器

  2. 2

    控制器加载数据时如何禁用emberJS中的文本字段

  3. 3

    点击文本字段时如何显示视图控制器?

  4. 4

    当我在视图控制器中移动时保存文本字段中的值

  5. 5

    为什么这个视图控制器不能设置下一个视图控制器的文本字段?

  6. 6

    当在两个文本字段之间更改光标时,Angular JS会收到警报

  7. 7

    QML:更改文本字段中的光标颜色

  8. 8

    切换浏览器选项卡时使光标不选择文本字段

  9. 9

    在Oracle ApEx中更改其他文本项时设置文本字段的显示值

  10. 10

    ms access-将光标在文本字段中的位置设置为仅在文本框为空时开始

  11. 11

    我应该如何向表视图控制器添加文本字段/按钮?

  12. 12

    Laravel文本字段表单占位符,使用来自控制器的数据

  13. 13

    您如何在查看控制器代码中获得文本字段输入?

  14. 14

    将值从输入文本字段传递到控制器

  15. 15

    从视图页面获取文本字段值到控制器页面

  16. 16

    如何在表视图控制器中放置文本字段以读取内容

  17. 17

    iOS视图控制器中的文本字段自定义

  18. 18

    快速从其他视图控制器调用文本字段(prepareforsegue)

  19. 19

    无法在控制器中获取多个文本字段值

  20. 20

    在警报控制器隐藏之前检查文本字段中的值 - iOS swift

  21. 21

    在第一个视图控制器的标签中显示输入到文本字段(在第二个视图控制器中)的文本?

  22. 22

    控制器可以从Rails应用程序的视图中获取文本字段,该字段是通过循环生成的:

  23. 23

    文本字段上的抖动光标位置

  24. 24

    iOS文本字段光标位置错误

  25. 25

    当用户更改文本字段时,ipyvuetify捕获文本字段的用户输入值

  26. 26

    设置片段的文本字段

  27. 27

    如何将第二个视图控制器文本字段值传递给第一个视图控制器数组并在 swift4 中点击按钮时关闭

  28. 28

    Flutter –如何设置电话号码文本字段的格式

  29. 29

    重新渲染视图时如何控制文本字段焦点?

热门标签

归档