【问题标题】:Flutter StreamProvider<List<DogModel>> can't be assignedFlutter StreamProvider<List<DogModel>> 无法赋值
【发布时间】:2022-01-09 13:29:01
【问题描述】:

我收到以下错误The argument type 'StreamProvider&lt;List&lt;DogModel&gt;&gt;' can't be assigned to the parameter type 'Stream&lt;List&lt;DogModel&gt;&gt;?'

当我尝试设置流stream: stream,时发生了意外

这里是小部件状态的流

final stream = StreamProvider<List<DogModel>>(
create: (context) =>
    DogFirestoreService().getDogs('GeVnAbdq9BWs1STbytlAU65qkbc2'),
initialData: const [],

);

小部件构建

Widget build(BuildContext context) {
//final test = context.watch<List<DogModel>>();
//print(test);
return SizedBox(
  width: MediaQuery.of(context).size.width,
  child: StreamBuilder<List<DogModel>>(
    stream: stream,
    builder: (context, snapshot) {
      if (!snapshot.hasData) {
        return const Text('no data');
      }

      if (snapshot.hasError) {
        return const Text('error');
      }

      if (snapshot.hasData) {
        return SizedBox(
          width: double.infinity,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Padding(
                padding: const EdgeInsets.only(
                  top: 65.0,
                  left: 18.0,
                  right: 18.0,
                ),
                child: Text(
                  dogsCount(value.dogsList.length),
                  style: AppStyles.listsHeaderTextStyle,
                ),
              ),
              ListView.builder(
                padding: const EdgeInsets.only(
                  top: 5,
                  bottom: 20,
                  left: 15,
                  right: 15,
                ),
                shrinkWrap: true,
                physics: const NeverScrollableScrollPhysics(),
                itemCount: value.dogsList.length,
                itemBuilder: (context, index) => DogProfileCardWidget(
                  dogInfo: value.dogsList[index],
                  editProfile: openProfileScreen,
                  dogIndex: index,
                ),
              ),
            ],
          ),
        );
      }
      return const Text('data');
    },
  ),
);

} }

【问题讨论】:

    标签: firebase flutter provider


    【解决方案1】:

    您的问题是stream 变量是StreamProvider

    StreamProviders 不是Streams,它们是Widgets。所以StreamBuilder 不明白它是什么。

    相反,您可能想要这样做:

    
    class Example extends StatefulWidget {
      const Example({Key? key}) : super(key: key);
    
      @override
      _ExampleState createState() => _ExampleState();
    }
    
    class _ExampleState extends State<Example> {
      // The stream needs to be stored in a StatefulWidfet
      // as you shouldn't create a new stream when the widget rebuild
      final stream = DogFirestoreService().getDogs('GeVnAbdq9BWs1STbytlAU65qkbc2');
    
      @override
      Widget build(BuildContext context) {
        return StreamBuilder<List<Dog>>(
          stream: stream,
          builder: ...,
        );
      }
    }
    

    【讨论】:

    • 如果你的 Stream 在根视图中有多个提供者,像这样 StreamProvider>( create: (context) => DogFirestoreService().getDogs('GeVnAbdq9BWs1STbytlAU65qkbc2'), initialData: const [], child: const DogsListScreen(), ), 还是在小部件内部?
    • 两者都很好。无论您使用Streamprovider + context.watch 还是StreamBuilder 都是在这里选择的问题。
    • 谢谢,@Remi 不应该在提供程序文件中抽象 getdogs(),而不是服务文件正在寻找文档但什么也没看到
    【解决方案2】:

    您不需要StreamBuilder,因为您使用的是StreamProvider。此外,在您的代码中将StreamProvider 放在哪里并不明显。顺便说一句,它是一个小部件,因此它应该位于示例中所示的小部件树之上。我看到你将它分配给final stream = ...,但我不知道为什么,因为它没有返回流。

    StreamProvider 将订阅您提供的流(即DogFirestoreService().getDogs('...')),一旦数据到达,它将在树的下方提供给您(最初,它将提供initialData)。

    我在 DartPad 上做了一个简单的例子,你可以在这里查看: Stream Provider Example.

    一旦您将 StreamProvider 小部件放在感兴趣的小部件上方,然后在您的 build 方法中,您就可以像这样直接访问数据:

    final data = context.watch<List<DogModel>>();
    

    在第一个构建中,您将获得您提供给StreamProviderinitialData,这是一个空列表。所以你可以这样做:

    @override 
    build(BuildContext context) {
      final data = context.watch<List<DogModel>>();
      if (data.isEmpty) {
         return const Text('no data');
      } 
      
      return SizedBox(/* the rest of your code */);
    }
    

    【讨论】:

    • 谢谢,但我需要它在 StreamBuilder 中,它有一个列表视图构建器
    • 如果做数据并将其添加到我得到的流中参数类型'List'不能分配给参数类型'Stream>?'跨度>
    猜你喜欢
    • 2021-07-21
    • 2023-01-13
    • 2020-10-21
    • 2020-05-01
    • 2021-09-12
    • 1970-01-01
    • 2020-05-25
    • 2019-12-23
    • 1970-01-01
    相关资源
    最近更新 更多