【问题标题】:Future<Widget> can't be assigned to the list type 'widget'Future<Widget> 不能分配给列表类型“小部件”
【发布时间】:2021-05-20 08:37:22
【问题描述】:

我正在制作一个对话框屏幕,其中包含一些下拉框和列表视图,如下所示。

showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            content: StatefulBuilder(
              builder: (BuildContext DialogContext, StateSetter setState) {
                return Column(
                  children: [
                    Dropdown(DialogContext, setState, 0, ReceiveArgs, _lListOfDepthList), 
                    Dropdown(DialogContext, setState, 1, ReceiveArgs, _lListOfDepthList),                        
                    FutureListView(ReceiveArgs),                                            
                  ],
                );
              },
            ),
          );
        });

因为我调用了一个未来函数 SetName,所以我也将“FutureListView”更改为未来函数。 FutureListView 代码如下。

       
  Future<Widget> FutureListView(ArgumentClass ReceiveArgs) async{
    String SelectedFullAddress = GetSelectedAddress(5, "");

    _Name = await SetName(ReceiveArgs.lFullList, SelectedFullAddress);

    if (_Name.isNotEmpty) {
      print("ListView!");
      return ListView.builder(
        itemCount: _Name.length,
        itemBuilder: (context, index) {
          return CheckboxListTile(
            title: Text(_Name[index]),
            value: null,
            onChanged: null,
          );
        },
      );
    } else {
      print("List Null");
      return Text("");
    }
  }

但是更改后,我在下面得到了一个编译错误。

错误:无法将元素类型“Future”分配给列表类型“Widget”。 (list_element_type_not_assignable at [checker_v2])

你能帮我解决这个问题吗?

同时我使用 StatefulBuilder 因为其他 Dropdownbutton 小部件相互交互。

谢谢!

【问题讨论】:

    标签: android flutter dart widget flutter-futurebuilder


    【解决方案1】:

    使用FutureBuilder

    这是您的FutureListView 的外观(您现在可以更改方法的名称)

     Future<String> FutureListView(ArgumentClass ReceiveArgs) async{
            String SelectedFullAddress = GetSelectedAddress(5, "");
      
            return await SetName(ReceiveArgs.lFullList, SelectedFullAddress);
          }
    

    而且,这应该是你的 showDialog

    showDialog(
            context: context,
            builder: (BuildContext context) {
              return AlertDialog(
                content: StatefulBuilder(
                  builder: (BuildContext DialogContext, StateSetter setState) {
                    return Column(
                      children: [
                        Dropdown(DialogContext, setState, 0, ReceiveArgs, _lListOfDepthList),
                        Dropdown(DialogContext, setState, 1, ReceiveArgs, _lListOfDepthList),
                        FutureBuilder<String>(
                        future: FutureListView(ReceiveArgs),
                        builder: (context, snapshot) => {
                          if(!snapshot.hasData) return Container(); // This container can be a loading screen, since its waiting for data.
    
                          if(snapshot.data.isNotEmpty){
                            print("ListView!");
                            return ListView.builder(
                              itemCount: _Name.length,
                              itemBuilder: (context, index) {
                                return CheckboxListTile(
                                  title: Text(_Name[index]),
                                  value: null,
                                  onChanged: null,
                                  );
                                },
                              );,
                            } else {
                              print("List Null");
                              return Text("");
                          },
                        )
                      ],
                    );
                  },
                ),
              );
            });
    

    FutureBuilder 的未来不会等到异步方法完成,而是尝试构建构建器方法直到它完成。您可以使用snapshot.hasData 检查异步方法是否已经返回了某些内容,如果没有,您可以根据需要显示加载屏幕。然后,使用snapshot.data 访问您未来的结果。

    【讨论】:

      【解决方案2】:

      您需要用Future 将小部件包装到FutureBuilder

      FutureBuilder<TypeOfName>(
        future: getName(),
        builder (context, snapshot) {
          // Data is not loading, you should show progress indicator to user
          if (!snapshot.hasData) {
            return CircularProgressIndicator();
          }
          // Data from Future is loaded
          final name = snapshot.data;
          if (name.isEmpty) {
            return Text('');
          } else {
            return ListView.builder(
              itemCount: name.length,
              itemBuilder: (context, index) {
                return CheckboxListTile(
                  title: Text(name[index]),
                  value: null,
                  onChanged: null,
                );
              },
            );
          }
        }
      );
      

      还有getName()方法:

      Future<TypeOfName> getName() {
        String SelectedFullAddress = GetSelectedAddress(5, "");
        return SetName(ReceiveArgs.lFullList, SelectedFullAddress);
      }
      

      并将TypeOfName 替换为_Name 变量的类型(您不能声明它)。

      【讨论】:

      • 谢谢!我也得到了你的提示,我解决了我的问题!谢谢
      【解决方案3】:

      使用类型 Widget 而不是 Future,因为您不能直接在小部件设计中调用 future。

      您可以像这样简单地修改您的代码。

        Widget FutureListView(ArgumentClass receiveArgs) {
          String SelectedFullAddress = GetSelectedAddress(5, "");
          _Name = await SetName(receiveArgs.lFullList, SelectedFullAddress);
          if (_Name.isNotEmpty) {
          bool _isChecked = false;
      
          print("ListView!");
            return ListView.builder(
              itemCount: 3,
              shrinkWrap: true,
              itemBuilder: (context, index) {
                return  CheckboxListTile(
                  value: _isChecked,
                  title: Text(_Name[index]),
                  onChanged: (bool value) {
                    setState(() {
                      _isChecked = value;
                    });
                  },
                );
              },
            );
          } else {
            print("List Null");
            return Text("");
          }
        }
      

      【讨论】:

        猜你喜欢
        • 2021-11-13
        • 2022-11-30
        • 2019-12-06
        • 1970-01-01
        • 2018-10-27
        • 1970-01-01
        • 2021-07-06
        • 2023-01-20
        • 1970-01-01
        相关资源
        最近更新 更多