我试图创建一个TextFormField,从其他逻辑中获取它的值,而不是直接键入文本。如果用户点击这个TextFormField,他们将被提示到一个新的屏幕,在那里他们可以从列表中选择东西,他们的选择将反映在TextFormField上。现在,选择可以是多个,因此文本可能比TextFormField的宽度长。现在我想让里面的文字可拖动,这样用户就可以看到他们的选择。我的这个TextFormField的代码是这样的:
GestureDetector(
onTap: () => Navigator.pushNamed(context, NamedRoutes.breedScreenRoute),
child: TextFormField(
controller: controller,
enabled: false,
decoration: InputDecoration(
suffixIcon: Padding(
SvgPicture.asset(
"assets/images/forwardArrow.svg",
fit: BoxFit.scaleDown,
)
),
contentPadding:
const EdgeInsets.symmetric(horizontal: 14.0, vertical: 15.0),
focusedBorder: const UnderlineInputBorder(
borderSide: BorderSide(color: Color(0xFFD9E2EC)),
),
enabledBorder: const UnderlineInputBorder(
borderSide: BorderSide(
color: Color(0xFFD9E2EC),
),
),
labelText: "Tell us more about the breed",
labelStyle: TextStyle(
fontSize: 14.0,
color: Color(0xFF6E7191),
fontWeight: FontWeight.w400,
),
),
),
);
如果我想拖动文本,我需要启用TextFormField。但是用户也可以输入我不想要的。我怎样才能做到这一点呢?
设置enabled: true
、scrollPhysics: AlwaysScrollableScrollPhysics()
、readOnly: true
。在TextFormField
中使用onTap
而不是GestureDetector
。用户可以滚动,但不能编辑。
TextFormField(
controller: controller,
enabled: true,
readOnly: true,
scrollPhysics: AlwaysScrollableScrollPhysics(),
onTap: () => Navigator.pushNamed(context, NamedRoutes.breedScreenRoute),
decoration: InputDecoration(
suffixIcon: Padding(
SvgPicture.asset(
"assets/images/forwardArrow.svg",
fit: BoxFit.scaleDown,
)
),
contentPadding:
const EdgeInsets.symmetric(horizontal: 14.0, vertical: 15.0),
focusedBorder: const UnderlineInputBorder(
borderSide: BorderSide(color: Color(0xFFD9E2EC)),
),
enabledBorder: const UnderlineInputBorder(
borderSide: BorderSide(
color: Color(0xFFD9E2EC),
),
),
labelText: "Tell us more about the breed",
labelStyle: TextStyle(
fontSize: 14.0,
color: Color(0xFF6E7191),
fontWeight: FontWeight.w400,
),
),
);
如果你不想在它的用户类型,那么为什么使用TextFormField()?考虑使用Text()或DropdownButton()