首页 > 解决方案 > 在 Flutter 中如何在 SearchDelegate buildResults 中显示对话框

问题描述

我正在尝试使用 Flutter SearchDelegate。我能够buildResults在容器中显示。我试图在 Dialog 或 BottomSheet 中显示结果。的返回类型buildResults是 Widget 和showDialogshowBottomSheet具有返回类型Future<dynamic>.

是否可以在 Dialog 或 BottomSheet 中显示 buildResults,我该怎么做?

编辑

为了清楚起见,我添加了代码。

class ProductSearch extends SearchDelegate<String> {
  Product product;
  List<Product> productsList = ProductData.productList;
  List<Product> recentProducts =
      ProductData.productList; //Find a way to keep recently searched


  @override
  List<Widget> buildActions(BuildContext context) {
    return [
      IconButton(
          icon: Icon(Icons.clear),
          onPressed: () {
            query = "";
          })
    ];
  }

  @override
  Widget buildLeading(BuildContext context) {
    return IconButton(
        icon: AnimatedIcon(
            icon: AnimatedIcons.menu_arrow, progress: transitionAnimation),
        onPressed: () {
          close(context, null);
        });
  }

  @override
  Widget buildResults(BuildContext context) {
    return Container(
      child: Text(product.productName),
    );
    /*
     *  I would like to return a showDialog or showBottomSheet
    */
    
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    final suggestionList = query.isEmpty
        ? recentProducts
        : productsList
            .where((element) =>
                element.productName.toUpperCase().contains(query.toUpperCase()))
            .toList();

    return ListView.builder(
      itemBuilder: (context, index) => Container(
        child: Card(
          elevation: 8.0,
          margin: EdgeInsets.symmetric(horizontal: 10.0, vertical: 6.0),
          child: Container(
            decoration: BoxDecoration(color: Colors.grey.shade100),
            child: ListTile(
              contentPadding:
                  EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
              onTap: () {
                product = suggestionList[index];
                showResults(context);
              },
              title: Text(
                suggestionList[index].productName,
                style: TextStyle(fontWeight: FontWeight.w500),
              ),
              leading: Container(
                padding: EdgeInsets.only(right: 5.0),
                child: Icon(
                  Icons.shopping_basket,
                ),
              ),
              subtitle: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                children: <Widget>[
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: <Widget>[
                      Align(
                        alignment: Alignment.topLeft,
                        child: Text(
                          "US\$ " + suggestionList[index].price.toString(),
                          style: TextStyle(
                            color: Constants.primaryColor,
                            fontSize: 12,
                          ),
                        ),
                      ),
                      Align(
                        alignment: Alignment.topRight,
                        child: Text(
                          suggestionList[index].stockLevel.toString() +
                              " Items in Stock",
                          style: TextStyle(
                            color: Constants.accentColor,
                            fontSize: 12,
                          ),
                        ),
                      ),
                    ],
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
      itemCount: suggestionList.length,
    );
  }
}

标签: flutterdart

解决方案


推荐阅读