颤振:在提供程序中使用颤振钩子时出现意外行为

时间:2021-03-17 11:30:55

标签: flutter dart

我正在使用钩子将我的 TextFormField 逻辑移动到钩子类并更改我正在使用提供程序的文本的可见性,但是当点击按钮更改可见性时,我使用 focusNode 将初始焦点移至第一个字段,但是当我点击它时,它会从 TextFormField 中删除整个文本并将焦点更改为第一个字段,如果第一个字段确实有文本,则它不会删除它(我认为它正在重建 UI)

我的钩子文件,

enum Index { email, password }

TextFormField useTextFormField(Index index) {
  return use(_CustomHook(index: index));
}

class _CustomHook extends Hook<TextFormField> {
  final Index index;

  _CustomHook({@required this.index});

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

class _CustomHookState extends HookState<TextFormField, _CustomHook> {
  Index index;
  @override
  TextFormField build(BuildContext context) {
    final isVisible = Provider.of<VisibilityProvider>(context);
    return TextFormField(
      decoration: InputDecoration(
          hintText: 'some help',
          suffixIcon: IconButton(
            onPressed: () {
              isVisible.changeVisibility();
            },
            icon: Icon(
                isVisible.visible ? Icons.visibility_off : Icons.visibility),
          )),
      validator: (text) {
        if (text.isEmpty) return 'enter something';

        return null;
      },
      obscureText: index == Index.email ? false : isVisible.visible,
    );
  }
}

提供者文件,


import 'package:flutter/material.dart';

class VisibilityProvider extends ChangeNotifier{

  bool _visible = true;

  bool get visible => _visible;
  void changeVisibility(){
    _visible = !_visible;
    notifyListeners();
  }
}

谁能告诉我在这里做错了什么?

0 个答案:

没有答案