问题描述
我在Flutter开发中使用riverpod进行状态管理。
我现在正在尝试创建一个需要状态管理的通用组件。
我使用riverpod制作了一个通用组件,如下代码。
class InputTextareaModel with ChangeNotifier {
String text;
String error;
String Function(String text) _validator;
void Function(String text) _onChanged;
bool _autovalidation;
set validator(String Function(String text) validator) {
this._validator = validator ?? (String text) => null;
}
set onChanged(void Function(String text) onChanged) {
this._onChanged = onChanged ?? (String text) {};
}
set autovalidation(bool autovalidation) {
this._autovalidation = autovalidation ?? true;
}
InputTextareaModel() {
this.text = '';
this.error = null;
}
onChangedText(String value) {
this.text = value;
this._onChanged(value);
if (this._autovalidation) {
this.onValidation();
}
notifyListeners();
}
onValidation() {
this.error = this._validator(this.text);
notifyListeners();
}
bool isError() {
return this.error != null ? true : false;
}
}
class InputTextarea extends HookWidget {
final String label;
final int minLines;
final int maxLines;
final String placeholder;
final provider;
final String Function(String text) validator;
final void Function(String text) onChanged;
final bool autovalidation;
InputTextarea(
{Key key,this.label,this.placeholder,provider,this.validator,this.onChanged,this.autovalidation,this.minLines = 3,this.maxLines = 5})
: this.provider =
provider ?? ChangeNotifierProvider((_) => InputTextareaModel()),super(key: key);
@override
Widget build(BuildContext context) {
final inputTextareaModel = useProvider<InputTextareaModel>(provider);
inputTextareaModel.validator = this.validator;
inputTextareaModel.onChanged = this.onChanged;
inputTextareaModel.autovalidation = this.autovalidation;
return TextField(
decoration: Inputdecoration(
alignLabelWithHint: true,labelText: this.label,hintText: this.placeholder,errorText: inputTextareaModel.error,border: OutlineInputBorder(),),keyboardType: TextInputType.multiline,minLines: this.minLines,maxLines: this.maxLines,onChanged: (value) {
inputTextareaModel.onChangedText(value);
},);
}
}
我用这样的代码调用这个通用组件:
final messageProvider =
ChangeNotifierProvider.autodispose((_) => InputTextareaModel());
InputTextarea(
minLines: 5,label: "message",placeholder: "test",provider: messageProvider,// We are injecting the provider at here.
validator: (value) {
if (value.replaceAll("\n","").isEmpty) {
return 'required message!';
}
return null;
},
我也可以通过这种方式创建一个通用组件,但我对此不太满意。
感觉用riverpod创建通用组件有更好的方法。
还是使用 statefulWidget 等创建它而不使用 riverpod 更好?
如果你知道任何好的方法,请告诉我!
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)