我试图将类型为Future>的Future Provider的输出调用到List View构建器中。我认为我已经很接近了,因为我能够渲染最终的列表 View 本身,但是在此之前,会出现一个错误,并且在完成Future后会很快被列表 View 替换。我认为我的实现可能存在问题。
到目前为止,这是我所得到的(这些是我实际代码的派生产品,不必要的事情太多了,我试图简化一下):
class TempProvider extends ChangeNotifier(){
List<Widget> _list = <Widget>[];
List<Widget get list => _list;
Future<List<Widget>> getList() async{
List _result = await db....
_result.forEach((_item){
addToList(_item);
});
}
addToList(Widget widget){
_list.add(widget);
notifyListeners();
}
}
class Parent extends StatelessWidget{
@override
Widget build(BuildContext context) {
return FutureProvider(
create: (context) => TempProvider().getList(),
child: Child(),
);
}
}
class Child extends StatelessWidget{
@override
Widget build(BuildContext context) {
var futureProvider = Provider.of<List<Widget>>(context);
return FutureBuilder(
initialData: <Widget>[],
future: TempProvider().getList(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.none &&
snapshot.hasData == true) {
return ListView.builder(
itemCount: futureProvider.length,
itemBuilder: (BuildContext context, int index) {
return futureProvider[index];
},
);
} else {
return Text('ALAWS');
}
},
);
}
}
因此,基本上,Future的输出将是一个小部件列表,这些小部件将填充我尝试构建的列表 View 。尽管我最终可以渲染列表 View ,但以下两者之间会出现以下错误:
The getter 'length' was called on null.
Receiver: null
Tried calling: length
The relevant error-causing widget was
FutureBuilder<List<Widget>>
希望有人可以对此提供帮助,或者至少给出一个更好的例子。
非常感谢!
最佳答案
不能确定,但是这是因为您的窗口小部件可能正在构建两次,并且最初的futureProvider为null,而第二次它具有一定的值(value)。
解决方法:
替换为:
futureProvider.length
有了这个:
futureProvider?.length ?? 0
上面的代码做什么?
futureProvider?.length
:如果futureProvider为null,请不要访问它的长度。 ?? 0
:如果返回的值为null,则返回0
; 您需要考虑以下事项并编辑代码。
futureProvider
不应为null。 snaphot.data
。 关于flutter - 通过 future 提供者值(value)查看Flutter列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60258410/