扩展 maxLines 属性时自动滚动多行 TextFormField
Automatically scroll multiline TextFormField when it extends the maxLines attribute
我正在实现一个 TextFormField,其 maxLines 属性设置为 3。当用户从他的第四行开始时,如何使 TextFormField 向下滚动?目前,在用户手动向下滚动之前,光标不再可见。有没有办法自动执行此操作?
此行为实际上出现在 'Text fields' 示例中的 flutter_gallery 应用程序中。只需在 'Live story' 输入框中键入一个长文本,直到到达第四行。
我的代码的重要部分实际上是这样的:
import 'package:flutter/material.dart';
class TextFormFieldDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Form(
child: new TextFormField(
maxLines: 3,
),
),
);
}
}
到目前为止,我还没有找到解决此问题的方法。
此问题同时影响 iOS 和 android。
这似乎是 Flutter Framework 中缺少的功能,我已经提交了一个错误来解决它:https://github.com/flutter/flutter/issues/9365
我们的团队通过嵌套一些现有的小部件实现了这一点:
// create the illusion of a beautifully scrolling text box
return new Container(
color: Colors.gray,
padding: new EdgeInsets.all(7.0),
child: new ConstrainedBox(
constraints: new BoxConstraints(
minWidth: _contextWidth(),
maxWidth: _contextWidth(),
minHeight: AppMeasurements.isLandscapePhone(context) ? 25.0 : 25.0,
maxHeight: 55.0,
),
child: new SingleChildScrollView(
scrollDirection: Axis.vertical,
reverse: true,
// here's the actual text box
child: new TextField(
keyboardType: TextInputType.multiline,
maxLines: null, //grow automatically
focusNode: mrFocus,
controller: _textController,
onSubmitted: currentIsComposing ? _handleSubmitted : null,
decoration: new InputDecoration.collapsed(
hintText: ''Please enter a lot of text',
),
),
// ends the actual text box
),
),
);
}
我们在 Darky 的帮助下获得了小部件排序和正确的小部件以使其正常工作。
我让它像这样工作。希望对您有所帮助!
return new Card(
shape: RoundedRectangleBorder(
side: BorderSide(
color: Colors.deepPurpleAccent,
width: 1
),
borderRadius: BorderRadius.circular(3)
),
child: Container(
height: 50,
child: SingleChildScrollView(
child: TextField(
maxLines: null,
),
),
),
);
您可以使用 BoxConstraints
并设置您的 TextFieldmaxHeight
Container(
constraints: BoxConstraints(maxHeight: 100),
child: SingleChildScrollView(
child: TextField(
maxLines: null,
),
),
);
使用最新的flutter 1.20.4,此文本字段在达到最大高度时会滚动。
Container(
constraints: BoxConstraints(maxHeight: 200),
child: TextField(
maxLines: null,
.......
)
)
如果您在 Raw 或列中使用文本字段,请将其包装在 Expanded
小部件中
只需使用 TextFormField()
小部件并设置 minLines=
和 maxLines=
。
缺少的东西在这里滚动指示器。
TextFormField(
minLines: 3,
maxLines: 3,
key: _messageValueKey,
decoration: _inputDecoration,
),
只需将 'reverse: true' 添加到您的可滚动小部件,如下所示:
Widget build(BuildContext context) {
return Container(
width: MediaQuery.of(context).size.width,
height: 130.0,
decoration: BoxDecoration(
border: Border.all(color: Colors.purpleAccent),
),
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
reverse: true,
child: Text(
'$message',
maxLines: 2,
style: TextStyle(fontSize: 30),
),
),
);
}
}
我用 ScrollController 解决了这个问题。
ScrollController textFieldScrollController = ScrollController();
TextField(
scrollController: textFieldScrollController,
keyboardType: TextInputType.multiline,
minLines: null,
maxLines: null,
onChanged: (value) {
textFieldScrollController.jumpTo(textFieldScrollController.position.maxScrollExtent);
},
),
我正在实现一个 TextFormField,其 maxLines 属性设置为 3。当用户从他的第四行开始时,如何使 TextFormField 向下滚动?目前,在用户手动向下滚动之前,光标不再可见。有没有办法自动执行此操作?
此行为实际上出现在 'Text fields' 示例中的 flutter_gallery 应用程序中。只需在 'Live story' 输入框中键入一个长文本,直到到达第四行。
我的代码的重要部分实际上是这样的:
import 'package:flutter/material.dart';
class TextFormFieldDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Form(
child: new TextFormField(
maxLines: 3,
),
),
);
}
}
到目前为止,我还没有找到解决此问题的方法。
此问题同时影响 iOS 和 android。
这似乎是 Flutter Framework 中缺少的功能,我已经提交了一个错误来解决它:https://github.com/flutter/flutter/issues/9365
我们的团队通过嵌套一些现有的小部件实现了这一点:
// create the illusion of a beautifully scrolling text box
return new Container(
color: Colors.gray,
padding: new EdgeInsets.all(7.0),
child: new ConstrainedBox(
constraints: new BoxConstraints(
minWidth: _contextWidth(),
maxWidth: _contextWidth(),
minHeight: AppMeasurements.isLandscapePhone(context) ? 25.0 : 25.0,
maxHeight: 55.0,
),
child: new SingleChildScrollView(
scrollDirection: Axis.vertical,
reverse: true,
// here's the actual text box
child: new TextField(
keyboardType: TextInputType.multiline,
maxLines: null, //grow automatically
focusNode: mrFocus,
controller: _textController,
onSubmitted: currentIsComposing ? _handleSubmitted : null,
decoration: new InputDecoration.collapsed(
hintText: ''Please enter a lot of text',
),
),
// ends the actual text box
),
),
);
}
我们在 Darky 的帮助下获得了小部件排序和正确的小部件以使其正常工作。
我让它像这样工作。希望对您有所帮助!
return new Card(
shape: RoundedRectangleBorder(
side: BorderSide(
color: Colors.deepPurpleAccent,
width: 1
),
borderRadius: BorderRadius.circular(3)
),
child: Container(
height: 50,
child: SingleChildScrollView(
child: TextField(
maxLines: null,
),
),
),
);
您可以使用 BoxConstraints
并设置您的 TextFieldmaxHeight
Container(
constraints: BoxConstraints(maxHeight: 100),
child: SingleChildScrollView(
child: TextField(
maxLines: null,
),
),
);
使用最新的flutter 1.20.4,此文本字段在达到最大高度时会滚动。
Container(
constraints: BoxConstraints(maxHeight: 200),
child: TextField(
maxLines: null,
.......
)
)
如果您在 Raw 或列中使用文本字段,请将其包装在 Expanded
小部件中
只需使用 TextFormField()
小部件并设置 minLines=
和 maxLines=
。
缺少的东西在这里滚动指示器。
TextFormField(
minLines: 3,
maxLines: 3,
key: _messageValueKey,
decoration: _inputDecoration,
),
只需将 'reverse: true' 添加到您的可滚动小部件,如下所示:
Widget build(BuildContext context) {
return Container(
width: MediaQuery.of(context).size.width,
height: 130.0,
decoration: BoxDecoration(
border: Border.all(color: Colors.purpleAccent),
),
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
reverse: true,
child: Text(
'$message',
maxLines: 2,
style: TextStyle(fontSize: 30),
),
),
);
}
}
我用 ScrollController 解决了这个问题。
ScrollController textFieldScrollController = ScrollController();
TextField(
scrollController: textFieldScrollController,
keyboardType: TextInputType.multiline,
minLines: null,
maxLines: null,
onChanged: (value) {
textFieldScrollController.jumpTo(textFieldScrollController.position.maxScrollExtent);
},
),