Android 未来<;Widget>;can';不能分配给列表类型';小部件';

Android 未来<;Widget>;can';不能分配给列表类型';小部件';,android,flutter,dart,widget,flutter-futurebuilder,Android,Flutter,Dart,Widget,Flutter Futurebuilder,我正在制作一个对话框屏幕,其中包含一些下拉框和列表视图,如下所示 showDialog( context: context, builder: (BuildContext context) { return AlertDialog( content: StatefulBuilder( builder: (BuildContext DialogContext, StateSetter setSt

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

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),                                            
                  ],
                );
              },
            ),
          );
        });
因为我调用了Future函数SetName,所以我也将FutureListView改为Future函数。 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 FutureListView(ArgumentClass ReceiveArgs)异步{
字符串SelectedFullAddress=GetSelectedAddress(5“”);
_Name=等待SetName(ReceiveArgs.lFullList,SelectedFullAddress);
if(_Name.isNotEmpty){
打印(“列表视图!”);
返回ListView.builder(
itemCount:_Name.length,
itemBuilder:(上下文,索引){
返回CheckboxListTile(
标题:文本(_名称[索引]),
值:null,
onChanged:null,
);
},
);
}否则{
打印(“列表为空”);
返回文本(“”);
}
}
但是在更改之后,我在下面得到了一个编译错误

错误:无法将元素类型“Future”分配给列表类型“Widget”。(列表元素类型不可在[checker\u v2]处分配)

你能帮我解决这个问题吗

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


谢谢大家!

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

FutureBuilder(
future:getName(),
生成器(上下文、快照){
//数据未加载,您应该向用户显示进度指示器
如果(!snapshot.hasData){
返回循环ProgressIndicator();
}
//来自Future的数据已加载
最终名称=snapshot.data;
如果(名称:isEmpty){
返回文本(“”);
}否则{
返回ListView.builder(
itemCount:name.length,
itemBuilder:(上下文,索引){
返回CheckboxListTile(
标题:文本(名称[索引]),
值:null,
onChanged:null,
);
},
);
}
}
);
getName()
方法:

Future getName(){
字符串SelectedFullAddress=GetSelectedAddress(5“”);
返回SetName(ReceiveArgs.lFullList,SelectedFullAddress);
}

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

您需要将小部件包装为
Future
FutureBuilder

FutureBuilder(
future:getName(),
生成器(上下文、快照){
//数据未加载,您应该向用户显示进度指示器
如果(!snapshot.hasData){
返回循环ProgressIndicator();
}
//来自Future的数据已加载
最终名称=snapshot.data;
如果(名称:isEmpty){
返回文本(“”);
}否则{
返回ListView.builder(
itemCount:name.length,
itemBuilder:(上下文,索引){
返回CheckboxListTile(
标题:文本(名称[索引]),
值:null,
onChanged:null,
);
},
);
}
}
);
getName()
方法:

Future getName(){
字符串SelectedFullAddress=GetSelectedAddress(5“”);
返回SetName(ReceiveArgs.lFullList,SelectedFullAddress);
}

并将
\u Name
变量的类型替换为
typeof Name

使用
FutureBuilder

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

Future FutureListView(ArgumentClass ReceiveArgs)异步{
字符串SelectedFullAddress=GetSelectedAddress(5“”);
return wait SetName(ReceiveArgs.lFullList,SelectedFullAddress);
}
这应该是你的展示对话

showDialog(
上下文:上下文,
生成器:(BuildContext上下文){
返回警报对话框(
内容:StatefulBuilder(
生成器:(BuildContext对话框上下文,StateSetter设置状态){
返回列(
儿童:[
下拉列表(DialogContext、setState、0、ReceiveArgs、_lListOfDepthList),
下拉列表(DialogContext,setState,1,ReceiveArgs,_lListOfDepthList),
未来建设者(
未来:未来列表视图(ReceiveArgs),
生成器:(上下文,快照)=>{
if(!snapshot.hasData)return Container();//此容器可以是加载屏幕,因为它正在等待数据。
if(snapshot.data.isNotEmpty){
打印(“列表视图!”);
返回ListView.builder(
itemCount:_Name.length,
itemBuilder:(上下文,索引){
返回CheckboxListTile(
标题:文本(_名称[索引]),
值:null,
onChanged:null,
);
},
);,
}否则{
打印(“列表为空”);
返回文本(“”);
},
)
],
);
},
),
);
});

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

使用
FutureBuilder

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

Future FutureListView(ArgumentClass ReceiveArgs)异步{
字符串SelectedFullAddress=GetSelectedAddress(5“”);
返回等待集合名(Rec
  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("");
    }
  }