当我尝试将textfieldcontroller作为flutter 2.5中的streambuilder中的事件推动时,键盘从数字变为alpha

发布于 2025-02-06 23:26:36 字数 1957 浏览 2 评论 0原文

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

final _controller = StreamDataController<TextEditingController>();

var texttype="";
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body:  StreamBuilder<TextEditingController>(
        stream: _controller.stream,
        builder: (context,snapShot){
          return HomeScreen();
        }),
      ),
    );
  }
}


class HomeScreen extends StatefulWidget {


  static final StringBuffer dummyText = StringBuffer();

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
   TextEditingController controllerText= TextEditingController(text: HomeScreen.dummyText.toString());

   @override
   void dispose() {
     super.dispose();
     controllerText.dispose();
   }

   //HomeScreen({required Key key}) : super(key: key);
  @override
  Widget build(BuildContext context) {

          return TextField(
            controller: controllerText,
            decoration: InputDecoration(
                labelText: "Enter Text here"
            ),

            onChanged: (String text){
              if((text.length - HomeScreen.dummyText.length).abs() == 3){
                controllerText=TextEditingController(text:text);
                HomeScreen.dummyText.write(text);
                _controller.pushEvent(controllerText);
              }
            },
          );
       // });

  }
}

class StreamDataController<T> {

  final _controller = StreamController<T>();

  Stream<T> get stream => _controller.stream;

  void pushEvent(T event){
    _controller.sink.add(event);
  }


  void dispose(){
    _controller.close();
  }

}

为此,任何解决方案都需要通过此方法刷新组件,只需避免每次尝试输入一个数字时,键盘从数字转移到Alpha。 我很可能是导致SCE引起的,我在Stream Builder中再次推动控制器,否则会发生这种情况,但我想要某种方法来解决此问题。这在Flutter 2.2.0版本之前正常工作。

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

final _controller = StreamDataController<TextEditingController>();

var texttype="";
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body:  StreamBuilder<TextEditingController>(
        stream: _controller.stream,
        builder: (context,snapShot){
          return HomeScreen();
        }),
      ),
    );
  }
}


class HomeScreen extends StatefulWidget {


  static final StringBuffer dummyText = StringBuffer();

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
   TextEditingController controllerText= TextEditingController(text: HomeScreen.dummyText.toString());

   @override
   void dispose() {
     super.dispose();
     controllerText.dispose();
   }

   //HomeScreen({required Key key}) : super(key: key);
  @override
  Widget build(BuildContext context) {

          return TextField(
            controller: controllerText,
            decoration: InputDecoration(
                labelText: "Enter Text here"
            ),

            onChanged: (String text){
              if((text.length - HomeScreen.dummyText.length).abs() == 3){
                controllerText=TextEditingController(text:text);
                HomeScreen.dummyText.write(text);
                _controller.pushEvent(controllerText);
              }
            },
          );
       // });

  }
}

class StreamDataController<T> {

  final _controller = StreamController<T>();

  Stream<T> get stream => _controller.stream;

  void pushEvent(T event){
    _controller.sink.add(event);
  }


  void dispose(){
    _controller.close();
  }

}

any fix for this since i do need to refresh my component by this method just avoid the keyboard shifting from numeric to alpha every time i try to enter a number.
it is most probably being caused sce i am pushing the controller again in stream builder, else it dosent happen but i want some way to fix this issue. this was working correctly before flutter 2.2.0 version.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浅唱々樱花落 2025-02-13 23:26:36

尝试将此行添加到您的TextField()

TextField(keyboardType: TextInputType.number)

更新答案(基于评论),

因此,如果您希望我单个TextField容纳不同的用例,例如手机号码和电子邮件,可以使用选择器来选择要输入的内容选择文本字段的输入类型的字段和条件。
我将添加一个有关代码的外观的小示例 -

enum KeybaordType {number, email}

KeyboardType type;

TextField(keyboardType: type == KeyboardType.number ? TextInputType.number : KeyboardType.email)

Try adding this line to your TextField()

TextField(keyboardType: TextInputType.number)

UPDATED ANSWER (based on the comment)

So if you want I single textfield to accommodate different use cases like for mobile number and email, you can use a selector to select what you'll be entering to the field and condition to choose the input type for the text field.
I will add a small example of how the code will look -

enum KeybaordType {number, email}

KeyboardType type;

TextField(keyboardType: type == KeyboardType.number ? TextInputType.number : KeyboardType.email)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文