自定义文本字段小部件的默认文本编辑控制器
default texteditingcontroller for custom text field widget
我想要一个默认的空控制器用于我的自定义文本字段,但它不允许这两种方式
您不能在拥有 const 构造函数的同时使用非常量默认值。
因此,您必须删除 CustomTextField 之前的 const 关键字。但是您也不能将 non-constant 值作为可选参数。
所以建议将无状态小部件更改为有状态小部件,如果构造函数没有提供控制器,则在 init() 方法中初始化控制器。
最好像这样设置一个默认控制器,这样我们就可以处理它以防止内存泄漏:
import 'package:flutter/material.dart';
class CustomTextField extends StatefulWidget {
const CustomTextField({
Key? key,
this.controller,
}) : super(key: key);
final TextEditingController? controller;
@override
State<CustomTextField> createState() => _CustomTextFieldState();
}
class _CustomTextFieldState extends State<CustomTextField> {
late TextEditingController _controller;
@override
void initState() {
super.initState();
_controller = widget.controller ?? TextEditingController();
}
@override
void dispose() {
if (widget.controller == null) {
// if we made the controller ourselves, we dispose it ourselves
// but if it's made outside of this widget, it should be disposed outside
_controller.dispose();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container();
}
}
我想要一个默认的空控制器用于我的自定义文本字段,但它不允许这两种方式
您不能在拥有 const 构造函数的同时使用非常量默认值。 因此,您必须删除 CustomTextField 之前的 const 关键字。但是您也不能将 non-constant 值作为可选参数。
所以建议将无状态小部件更改为有状态小部件,如果构造函数没有提供控制器,则在 init() 方法中初始化控制器。
最好像这样设置一个默认控制器,这样我们就可以处理它以防止内存泄漏:
import 'package:flutter/material.dart';
class CustomTextField extends StatefulWidget {
const CustomTextField({
Key? key,
this.controller,
}) : super(key: key);
final TextEditingController? controller;
@override
State<CustomTextField> createState() => _CustomTextFieldState();
}
class _CustomTextFieldState extends State<CustomTextField> {
late TextEditingController _controller;
@override
void initState() {
super.initState();
_controller = widget.controller ?? TextEditingController();
}
@override
void dispose() {
if (widget.controller == null) {
// if we made the controller ourselves, we dispose it ourselves
// but if it's made outside of this widget, it should be disposed outside
_controller.dispose();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container();
}
}