【问题标题】:Flutter List View through Future Provider ValueFlutter List View 通过 Future Provider Value
【发布时间】:2020-06-01 03:31:39
【问题描述】:

我正在尝试将 Future 类型的 Future Provider 的输出调用到列表视图构建器中。我认为我非常接近,因为我能够呈现最终的列表视图本身,但是,在此之前,会出现一个错误,并在完成 Future 后迅速被列表视图替换。我相信我的实现可能有问题。

这是我到目前为止所得到的(这些是我实际代码的派生,那里有太多不必要的东西,我试图简化它):

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 的输出将是一个小部件列表,这些小部件将填充我正在尝试构建的列表视图。虽然我最终能够呈现列表视图,但下面的错误出现在两者之间:

The getter 'length' was called on null.
Receiver: null
Tried calling: length
The relevant error-causing widget was
FutureBuilder<List<Widget>> 

希望有人可以帮助解决这个问题,或者至少举一个更好的例子。

非常感谢!

【问题讨论】:

  • 我认为你应该得到 snapshot.data 的长度而不是 futureProvider 的长度。所以基本上放“itemCount:snapshot.data.length”。

标签: flutter dart flutter-provider


【解决方案1】:

所以我一直在做研究,发现下面的文章根据我的需要显示了一个明确的实现:

Flutter Provider Examples - Codetober 归功于 Douglas Tober 的文章。再次感谢 Kalpesh 的快速帮助!

【讨论】:

    【解决方案2】:

    不确定,但会发生这种情况,因为您的小部件可能会构建两次,第一次 futureProvider 为空,第二次它有一些值。

    解决方法:

    替换这个:

    futureProvider.length
    

    有了这个:

    futureProvider?.length ?? 0
    

    上面的代码做了什么?

    1. futureProvider?.length: 如果 futureProvider 为空,则不要访问它的长度。
    2. 现在返回的值为空。
    3. ?? 0:如果返回值为null则返回0

    您需要考虑以下事项并编辑您的代码。

    1. 首先futureProvider不应为空。
    2. 您在使用 FutureBuilder 时为什么不使用 snaphot.data

    【讨论】:

    • 天哪,这太聪明了!我没有想到这一点。我将尝试进行更多调查以补充您的提示,这是一个很好的线索。
    猜你喜欢
    • 2021-01-08
    • 2022-01-03
    • 1970-01-01
    • 2020-09-18
    • 2021-09-02
    • 2020-06-12
    • 2020-11-23
    • 2021-02-09
    • 2020-04-16
    相关资源
    最近更新 更多