Flutter 如何在flatter中创建公共参数类型小部件函数

Flutter 如何在flatter中创建公共参数类型小部件函数,flutter,widget,flutter-dependencies,Flutter,Widget,Flutter Dependencies,我正在页面类函数中创建公共参数类型小部件函数。但需要创建用于多个类/页的公共参数类型小部件函数 DropdownSearch<ProductModel>( searchBoxController: TextEditingController(text: ''), mode: Mode.BOTTOM_SHEET, isFiltere

我正在页面类函数中创建公共参数类型小部件函数。但需要创建用于多个类/页的公共参数类型小部件函数

                  DropdownSearch<ProductModel>(
                    searchBoxController: TextEditingController(text: ''),
                    mode: Mode.BOTTOM_SHEET,
                    isFilteredOnline: true,
                    showClearButton: true,
                    showSearchBox: true,
                    //label: 'Product Name *',
                    searchBoxDecoration: InputDecoration(
                        hintText:'Search Product',
                        contentPadding: EdgeInsets.fromLTRB(12, 12, 0, 0),
                        border: OutlineInputBorder()
                    ),
                    dropdownSearchDecoration: InputDecoration(
                      hintText:'Select Product',
                      contentPadding: EdgeInsets.fromLTRB(5, 0, 0, 0),
                      hintStyle: TextStyle(fontSize: 12.0),
                    ),
                    emptyBuilder:_customEmptyBuilderProduct,
                    selectedItem:jobLineList[index].productModel,
                    onFind: (String filter) => getProductData(filter),
                    dropdownBuilder: _customDropDownProduct,
                    popupItemBuilder: _customPopupItemBuilderProduct,
                    onChanged: (ProductModel value) {
                      print('onchanged');
                      print(value);
                      if(value == null) {
                      }
                      else {
                      }
                    },
                  ), 
如何在颤振中使_customDropDownProduct成为常用功能

像这样得到错误
参数类型“Widget”无法分配给参数类型“Widget Function(BuildContext,Model,String)”。

我猜您在dropdownBuilder参数中使用了
\u customDropDownProduct()
。相反,您应该使用
\u customDropDownProduct

因此,您不会传递函数(
Widget
)的结果,而是传递函数本身
Widget函数(BuildContext、Model、String)

要使其在任何地方都可用,您有两种选择:

  • 提取
    \u customDropDownProduct
    方法并使其成为全局函数
  • 制作一个
    CustomDropDownProduct
    小部件,并在不同的屏幕中使用它
  • 选项2的代码如下:

    CustomDropDownProduct类:

    class CustomDropDownProduct extends StatelessWidget {
      final ProductModel item;
      final String itemDesignation;
    
      CustomDropDownProduct({Key key, @required this.item, @required this.itemDesignation}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          //height: 20.0,
          child: (item?.masterProductName == null)
              ? ListTile(
            contentPadding: EdgeInsets.all(0),
            //leading: CircleAvatar(),
            title: Text("No product selected", style: TextStyle(fontSize: 12.0)),
          )
              : ListTile(
            contentPadding: EdgeInsets.all(0),
            title: Text(item.masterProductName, style: TextStyle(fontSize: 12.0)),
          ),
        );
      }
    }
    
    如何从dropdownBuilder调用它:

    dropdownBuilder: (BuildContext context, ProductModel item, String itemDesignation) => 
        CustomDropDownProduct(
            item: item,
            itemDesignation: itemDesignation,
        ),
    

    如果我这样调用:dropdownBuilder:\u customDropDownProducttest(小部件),错误:位置参数太少:需要3个,给定1个。dropdownBuilder:_customDropDownProducttest(小部件),上下文:找到了此候选项,但参数不匹配_customDropDownProducttest(BuildContext上下文,ProductModel项,String项指定){很抱歉,我的回答可能有误导性。我重写了它,现在更清楚了吗?是的,我称它为类内的类似_customDropDownProduct,它在工作。但我想在类外实现公共化,以便使用多个屏幕
    dropdownBuilder: (BuildContext context, ProductModel item, String itemDesignation) => 
        CustomDropDownProduct(
            item: item,
            itemDesignation: itemDesignation,
        ),