如何将事件类型传递给具有块模式的小部件?

时间:2019-03-31 02:08:32

标签: dart flutter

我正在尝试创建具有阻止模式和flutter_block库的应用。它正在工作,但是现在我想减少代码。

我有很多:

dart

Padding(
  padding:
      EdgeInsets.symmetric(horizontal: 10.0, vertical: 5.0),
  child: TextField(
    inputFormatters: [
      BlacklistingTextInputFormatter(RegExp("[a-zA-Z]"))
    ],
    decoration: InputDecoration(
        labelText: 'label text'),
    keyboardType: TextInputType.number,
    controller: _service,
    onChanged: (value) =>
        {_prefsBloc.dispatch(SetServicePrefs(value))},
  ),
),

我正在小部件中对其进行转换:

dart

class SettingTextField extends StatelessWidget {
  final String text;
  final String labelText;


  SettingTextField({this.text, this.labelText});

  @override
  Widget build(BuildContext context) {
    final PrefsBloc _prefsBloc = BlocProvider.of<PrefsBloc>(context);
    final TextEditingController _controller = TextEditingController();
    _controller.text = this.text;

    if (this.text != null) {
      _controller.selection = TextSelection.collapsed(offset: this.text.length);
    }
    return Padding(
      padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 5.0),
      child: TextField(
          inputFormatters: [BlacklistingTextInputFormatter(RegExp("[a-zA-Z]"))],
          decoration: InputDecoration(labelText: this.labelText),
          keyboardType: TextInputType.number,
          controller: _controller,
          onChanged: (value) {}

    );
  }
}

对于每个字段,我都有一个不同的事件要分派,例如:

_prefsBloc.dispatch(SetServicePrefs(value))

但是我真的不知道如何将类型SetServicePrefs传递给我的小部件并在onChanged函数中使用它。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可以将其他回调字段添加到SettingTextField:

class SettingTextField extends StatelessWidget {
  final String text;
  final String labelText;    
  final Function(PrefsBloc bloc, value) onChanged;

    ...

    TextField(
              inputFormatters: [BlacklistingTextInputFormatter(RegExp("[a-zA-Z]"))],
              decoration: InputDecoration(labelText: this.labelText),
              keyboardType: TextInputType.number,
              controller: _controller,
              onChanged: (value) => onChanged(_prefsBloc, value)
        )

...

}

然后调用SettingTextField:

SettingTextField(
...
onChanged: (bloc, value) => bloc.dispatch(SomeEventType(value))
...
)