flutter - 如何将控制器数据从一个小部件传递到另一个小部件
问题描述
在我的searchPage.dart
我有两个 statefulWidgetSearchScreen
和TopSearchWidget
. SearchScreen
有一个TextField
,当用户开始输入时,它应该从另一个小部件填充,TopSearchWidget
但我不知道如何将参数/数据从一个小部件传递到另一个小部件。这是我的代码
class SearchPage extends StatefulWidget {
const SearchPage({Key key}) : super(key: key);
@override
State<StatefulWidget> createState() => _SearchPageState();
}
class _SearchPageState extends State<SearchPage> {
TextEditingController dropOffTextEditingController = TextEditingController();
);
@override
void initState() {
super.initState();
dropOffTextEditingController.addListener(textOnChanged);
}
void textOnChanged() {
controller.setSearchableText(dropOffTextEditingController.text);
}
@override
void dispose() {
dropOffTextEditingController.removeListener(textOnChanged);
super.dispose();
}
@override
Widget build(BuildContext context) {
......
Row(
children: [
SizedBox(width: 18.0),
Expanded(
child: Container(
decoration: BoxDecoration(
color: Colors.grey[400],
borderRadius: BorderRadius.circular(5.0),
),
child: Padding(
padding: EdgeInsets.all(3.0),
child: TextField(
controller: dropOffTextEditingController,
onEditingComplete: () async {
FocusScope.of(context).requestFocus(new FocusNode());
},
decoration: InputDecoration(
hintText: "Drop off Location",
fillColor: Colors.grey[400],
filled: true,
border: InputBorder.none,
isDense: true,
contentPadding: EdgeInsets.only(left: 11.0, top: 8.0, bottom: 8.0),
),
),
),
))
],
),
SizedBox(height: 10.0),
topWidgetPicker: TopSearchWidget(),
并从 TextField 接收数据,以便它可以开始搜索..
class TopSearchWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() => _TopSearchWidgetState();
}
class _TopSearchWidgetState extends State<TopSearchWidget> {
@override
void initState() {
super.initState();
controller = ***** What should go here *****?
controller.searchableText.addListener(onSearchableTextChanged);
}
void onSearchableTextChanged() async {
final v = controller.searchableText.value;
.............
}
解决方案
您可以将控制器从您的SearchPage
向下传递到TopSearchWidget
?
class _SearchPageState extends State<SearchPage> {
final dropOffTextEditingController = TextEditingController();
@override
Widget build(BuildContext context) {
// ...
topWidgetPicker: TopSearchWidget(dropOffTextEditingController),
// ...
}
}
class TopSearchWidget extends StatefulWidget {
final TextEditingController controller;
TopSearchWidget(this.controller);
@override
State<StatefulWidget> createState() => _TopSearchWidgetState();
}
class _TopSearchWidgetState extends State<TopSearchWidget> {
@override
void initState() {
super.initState();
widget.controller.searchableText.addListener(onSearchableTextChanged);
}
void onSearchableTextChanged() async {
final v = widget.controller.searchableText.value;
.............
}
}
推荐阅读
- r - 谁能解释粘贴在字符(0)上的奇怪行为?
- android - 无法使用 android studio 3.1.3 为 ApkVariantOutputImpl_Decorated 设置只读属性“outputFile”的值
- ckan - 如何获得 CKAN 完整的搜索结果
- android - Android Studio 不要求选择活动
- eclipse - 开放资源快捷方式不起作用
- python - 如何在金额前添加 $ 符号?
- spring - 在 Spring Data JPA 中自定义参数为 List 的查询方法
- json - 从 Json 文件中提取数据
- node.js - 如果更好,将 bcrypt.compareSync 更改为 async
- sql-server - 适用于 IaaS 的 Azure SQL 备份