更改下拉菜单项时自动调用 TextButton
TextButton is automatically invoked when the dropDown menu item is changed
这是我的代码,
我正在使用 TextButton
来更新订单,但是在每次更改下拉项后,都会自动调用 onPress 并自动调用函数 updateOrder
import 'package:admin/constants/Constants.dart';
import 'package:admin/model/order_model.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter/material.dart';
class DetailsScreen extends StatefulWidget {
const DetailsScreen({Key? key}) : super(key: key);
@override
State<DetailsScreen> createState() => _DetailsScreenState();
}
class _DetailsScreenState extends State<DetailsScreen> {
List<String> _dropDownQuantities = [Pending, Confirmed, Rejected, Success];
late OrderModel order;
late String selectedStatus = order.status;
@override
Widget build(BuildContext context) {
order = ModalRoute.of(context)?.settings.arguments as OrderModel;
return Scaffold(
appBar: AppBar(
actions: [],
title: Text("Order Details"),
),
body: Column(children: [
Text(order.id),
DropdownButtonHideUnderline(
child: DropdownButton2<String>(
value: selectedStatus,
items: _dropDownQuantities
.map((e) => DropdownMenuItem<String>(
child: Text(e),
value: e,
))
.toList(),
onChanged: (value) {
setState(() {
selectedStatus = value;
});
},
)),
TextButton(onPressed: updateOrder(order, selectedStatus), child: Text("Confirm")),
]));
}
}
updateOrder(OrderModel order, String selected) {
print("I am executed");
}
所以每当我更改下拉菜单时,
I am executed
打印在控制台中。
编辑:
但是当我将容器与 InkWell 一起使用时,它工作正常。为什么不使用 TextButton?
您是在构建时直接调用该方法,您可以创建一个内联匿名函数来处理这个问题。
TextButton(
onPressed: ()=> updateOrder(order, selectedStatus),
child: Text("Confirm")),
onPressed
Called when the button is tapped or otherwise activated.
虽然我们在每次构建时都使用 onPressed:method()
调用,但在下拉 onChanged
上我们使用 setState
,它会再次重建 UI 和 onPressed:method()
调用.
我们在这里需要传递一个函数(VoidCallback
),当我们点击按钮时它会触发。我们提供它,
onPressed:(){
myMethod();
}
更多关于 TextButton
。
这是我的代码,
我正在使用 TextButton
来更新订单,但是在每次更改下拉项后,都会自动调用 onPress 并自动调用函数 updateOrder
import 'package:admin/constants/Constants.dart';
import 'package:admin/model/order_model.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter/material.dart';
class DetailsScreen extends StatefulWidget {
const DetailsScreen({Key? key}) : super(key: key);
@override
State<DetailsScreen> createState() => _DetailsScreenState();
}
class _DetailsScreenState extends State<DetailsScreen> {
List<String> _dropDownQuantities = [Pending, Confirmed, Rejected, Success];
late OrderModel order;
late String selectedStatus = order.status;
@override
Widget build(BuildContext context) {
order = ModalRoute.of(context)?.settings.arguments as OrderModel;
return Scaffold(
appBar: AppBar(
actions: [],
title: Text("Order Details"),
),
body: Column(children: [
Text(order.id),
DropdownButtonHideUnderline(
child: DropdownButton2<String>(
value: selectedStatus,
items: _dropDownQuantities
.map((e) => DropdownMenuItem<String>(
child: Text(e),
value: e,
))
.toList(),
onChanged: (value) {
setState(() {
selectedStatus = value;
});
},
)),
TextButton(onPressed: updateOrder(order, selectedStatus), child: Text("Confirm")),
]));
}
}
updateOrder(OrderModel order, String selected) {
print("I am executed");
}
所以每当我更改下拉菜单时,
I am executed
打印在控制台中。
编辑:
但是当我将容器与 InkWell 一起使用时,它工作正常。为什么不使用 TextButton?
您是在构建时直接调用该方法,您可以创建一个内联匿名函数来处理这个问题。
TextButton(
onPressed: ()=> updateOrder(order, selectedStatus),
child: Text("Confirm")),
onPressed
Called when the button is tapped or otherwise activated.
虽然我们在每次构建时都使用 onPressed:method()
调用,但在下拉 onChanged
上我们使用 setState
,它会再次重建 UI 和 onPressed:method()
调用.
我们在这里需要传递一个函数(VoidCallback
),当我们点击按钮时它会触发。我们提供它,
onPressed:(){
myMethod();
}
更多关于 TextButton
。