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("");
}
}