首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当HookWidget的文本发生变化时,有什么方法可以让我重新构建TextEditingController吗?

当HookWidget的文本发生变化时,有什么方法可以让我重新构建TextEditingController吗?
EN

Stack Overflow用户
提问于 2022-03-07 02:42:01
回答 1查看 927关注 0票数 0

我有一个测试编辑字段。当没有文本时,我想要一个按钮被禁用。当TextField中有文本时,我希望启用按钮。

我使用flutter_hooks来减少控制器的锅炉板代码。

在下面的示例中,当我在文本字段中输入test时,按钮永远不会启用,因为生成没有被触发?当使用带有颤振钩的文本编辑控制器时,如何触发生成?

代码语言:javascript
复制
class MyHomePage extends HookWidget {
  const MyHomePage({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    var ctrl = useTextEditingController();
    VoidCallback? onPressed;
    if (ctrl.text.isNotEmpty) {
      onPressed = () => print("Pressed!");
    }
    return Scaffold(
      body: Column(
        children: [
          TextField(
            controller: ctrl,
          ),
          ElevatedButton(onPressed: onPressed, child: Text("Button")),
        ],
      )
    );
  }
}
EN

回答 1

Stack Overflow用户

发布于 2022-03-07 04:59:26

您可以使用useStateuseTextEditingController来实现这一点。

代码语言:javascript
复制
var istextchanged = useState<bool>(false);
ctrl.addListener(() {
  if (ctrl.text.isEmpty) {
    istextchanged.value = false;
  } else {
    istextchanged.value = true;
  }
});

Yourwidget

代码语言:javascript
复制
class MyHomePages2 extends HookWidget {
  const MyHomePages2({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    var ctrl = useTextEditingController();
    var istextchanged = useState<bool>(false);
    ctrl.addListener(() {
      if (ctrl.text.isEmpty) {
        istextchanged.value = false;
      } else {
        istextchanged.value = true;
      }
    });

    VoidCallback? onPressed = () {
      print("change");
    };
    if (ctrl.text.isNotEmpty) {
      onPressed = () => print("Pressed!");
    }
    return Scaffold(
        body: Column(
      children: [
        TextField(
          controller: ctrl,
          onChanged: (v) {},
        ),
        ElevatedButton(
            onPressed: istextchanged.value ? onPressed : null,
            child: Text("Button"))
      ],
    ));
  }
}

使用flutter_hooks: ^0.18.2+1 钩子的软件包

SampleCode

代码语言:javascript
复制
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

int myvalue = 0;

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  @override
  void initState() {
    // functions().then((int value) {
    //   setState(() {
    //     myvalue = value;
    //   });
    // future is completed you can perform your task
    // });
  }

  Future<int> functions() async {
    // do something here
    return Future.value();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: MyHomePages2(),
    );
  }
}

class MyHomePages2 extends HookWidget {
  const MyHomePages2({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    var ctrl = useTextEditingController();
    var istextchanged = useState<bool>(false);
    ctrl.addListener(() {
      if (ctrl.text.isEmpty) {
        istextchanged.value = false;
      } else {
        istextchanged.value = true;
      }
    });

    VoidCallback? onPressed = () {
      print("change");
    };
    if (ctrl.text.isNotEmpty) {
      onPressed = () => print("Pressed!");
    }
    return Scaffold(
        body: Column(
      children: [
        TextField(
          controller: ctrl,
          onChanged: (v) {},
        ),
        ElevatedButton(
            onPressed: istextchanged.value ? onPressed : null,
            child: Text("Button"))
      ],
    ));
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71375923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档