更改下拉菜单项时自动调用 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