每次屏幕发生变化时都会调用屏幕的构造函数

穆罕默德阿里

textformfield在推入的屏幕中点击 a 时,屏幕的构造函数将再次被调用,并且 将textformfield失去其值。另外,我认为该屏幕中发生的每一次更改都会导致再次调用其构造函数,而我根本不知道原因。

这是生成错误的示例代码:

import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Hello',
              style: TextStyle(color: Colors.black, fontSize: 30.0),
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.of(context).push(
              MaterialPageRoute(builder: (context) => NextScreen(Bloc())));
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

这是要推送的屏幕

class NextScreen extends StatefulWidget {
  final _bloc;
  NextScreen(this._bloc);

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

class _NextScreenState extends State<NextScreen> {
  @override
  void dispose() {
    widget._bloc.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          Padding(
            padding: EdgeInsets.all(100.0),
            child: IconButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              icon: Icon(Icons.arrow_back),
              iconSize: 20.0,
            ),
          ),
          StreamBuilder<String>(
              stream: widget._bloc.stream,
              builder: (context, snapshot) {
                return TextFormField(
                  controller: widget._bloc.controller,
                  onFieldSubmitted: widget._bloc.submitData(),
                  decoration: InputDecoration(
                    hintText: 'Enter your name..',
                    errorText: snapshot.data,
                  ),
                );
              })
        ],
      ),
    );
  }
}

验证用户输入的块

class Bloc {
  TextEditingController _controller;
  TextEditingController get controller => _controller;

  BehaviorSubject<String> _subject;

  BehaviorSubject<String> _validatorSubject;
  Stream<String> get stream => _validatorSubject.stream;

  void submitData() {
    _subject.sink.add(controller.text);
  }

  void _validate(String text) {
    if (!RegExp(r'[0-9]').hasMatch(text)) {
      _validatorSubject.sink.add('numbers only');
    } else {
      _validatorSubject.sink.add(null);
    }
  }

  Bloc() {
    _controller = TextEditingController();
    _subject = BehaviorSubject<String>();
    _validatorSubject = BehaviorSubject<String>();
    _subject.stream.listen(_validate);
  }

  void dispose() {
    _subject.close();
    _validatorSubject.close();
  }
}

萨迪普·辛格 |

打开和关闭键盘将重建整个屏幕。这里真正的罪魁祸首是 textController :

controller: widget._bloc.controller,

对我有用的解决方案是删除这条线。

同样要获取和验证更改的文本,您可以在文本字段中使用 onChanged,它返回一个字符串。像这样 :

.
.
.
 return TextFormField(
       onChanged: widget._bloc.submitData,
       decoration: InputDecoration
.
.
.

你 submitData() 方法会是这样的:

    void submitData(String data) {
    _subject.sink.add(data);
  }

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当屏幕分辨率发生变化时,div 的位置也在变化

来自分类Dev

每次Ember发生变化时如何运行代码

来自分类Dev

每当状态发生变化时,在React组件的渲染函数中调用返回JSX的方法时,性能都会受到影响吗?

来自分类Dev

仅在原子值发生变化时才调用副作用函数

来自分类Dev

选定的值因敲除而发生变化时调用函数

来自分类Dev

当某些变量发生变化时如何激活函数?

来自分类Dev

OnChange 函数在发生变化时不会触发

来自分类Dev

当使用 Babylonjs 时浏览器的屏幕尺寸发生变化时,如何使画布保持在相机的焦点(中心)?

来自分类Dev

每次进行API调用时,键数发生变化时,如何解析JSON Array?

来自分类Dev

$watch 服务发生变化时

来自分类Dev

每当元素clientWidth发生变化时,Vue都会更新数据道具

来自分类Dev

当下一个屏幕上的值发生变化时,在上一个屏幕上获取触发器

来自分类Dev

迅速-函数调用后对象发生变化

来自分类Dev

python中的函数调用后变量发生变化

来自分类Dev

每次激活组件的路由中的参数发生变化时如何激活组件

来自分类Dev

每次单元格发生变化时运行脚本

来自分类Dev

每次数据框列的值发生变化时如何枚举?

来自分类Dev

每次使用Pytorch正向通行证都会发生变化?

来自分类Dev

当函数中的值发生变化时,指针不反映变化

来自分类Dev

如果“夜间模式”为“仅”且仅当屏幕旋转发生变化时,将重新创建活动

来自分类Dev

调用构造函数后,为什么initializer_list中的vector <int>的值会发生变化?

来自分类Dev

当适配器类的内容发生变化时,适配器调用 notifyDataSetChanged()

来自分类Dev

当输入值发生变化时,何时从控制器调用管道?

来自分类Dev

当工作表中的单元格发生变化时,如何防止Google工作表中的NOW()函数每次更新?

来自分类Dev

当变量的值发生变化时,Flutter 会执行一个函数

来自分类Dev

Python,当某些列表元素发生变化时执行函数

来自分类Dev

当变量组中的任何一个发生变化时,执行函数

来自分类Dev

当函数内部的变量发生变化时如何更新字典值

来自分类Dev

当 ClassA 发生变化时,如何在 ClassB 上执行函数?

Related 相关文章

  1. 1

    当屏幕分辨率发生变化时,div 的位置也在变化

  2. 2

    每次Ember发生变化时如何运行代码

  3. 3

    每当状态发生变化时,在React组件的渲染函数中调用返回JSX的方法时,性能都会受到影响吗?

  4. 4

    仅在原子值发生变化时才调用副作用函数

  5. 5

    选定的值因敲除而发生变化时调用函数

  6. 6

    当某些变量发生变化时如何激活函数?

  7. 7

    OnChange 函数在发生变化时不会触发

  8. 8

    当使用 Babylonjs 时浏览器的屏幕尺寸发生变化时,如何使画布保持在相机的焦点(中心)?

  9. 9

    每次进行API调用时,键数发生变化时,如何解析JSON Array?

  10. 10

    $watch 服务发生变化时

  11. 11

    每当元素clientWidth发生变化时,Vue都会更新数据道具

  12. 12

    当下一个屏幕上的值发生变化时,在上一个屏幕上获取触发器

  13. 13

    迅速-函数调用后对象发生变化

  14. 14

    python中的函数调用后变量发生变化

  15. 15

    每次激活组件的路由中的参数发生变化时如何激活组件

  16. 16

    每次单元格发生变化时运行脚本

  17. 17

    每次数据框列的值发生变化时如何枚举?

  18. 18

    每次使用Pytorch正向通行证都会发生变化?

  19. 19

    当函数中的值发生变化时,指针不反映变化

  20. 20

    如果“夜间模式”为“仅”且仅当屏幕旋转发生变化时,将重新创建活动

  21. 21

    调用构造函数后,为什么initializer_list中的vector <int>的值会发生变化?

  22. 22

    当适配器类的内容发生变化时,适配器调用 notifyDataSetChanged()

  23. 23

    当输入值发生变化时,何时从控制器调用管道?

  24. 24

    当工作表中的单元格发生变化时,如何防止Google工作表中的NOW()函数每次更新?

  25. 25

    当变量的值发生变化时,Flutter 会执行一个函数

  26. 26

    Python,当某些列表元素发生变化时执行函数

  27. 27

    当变量组中的任何一个发生变化时,执行函数

  28. 28

    当函数内部的变量发生变化时如何更新字典值

  29. 29

    当 ClassA 发生变化时,如何在 ClassB 上执行函数?

热门标签

归档