我有这样一个StreamBuilder:

StreamBuilder<List<AuthInfo>>(
            stream: myDatabase.authInfosDao.watch(),
            builder: (context, snapshot) => (snapshot.data?.length ?? 0) > 0
                ? Home()
                : Auth()),

我想把它重做成一个流提供者,事情就是这样:

StreamProvider<List<AuthInfo>>.value(
            value: myDatabase.authInfosDao.watch(),
            initialData: [],
            builder: (BuildContext context, AsyncSnapshop snapshot)...

我不知道如何使用"Value"中的数据来加载所需的页面,因为StreamProvider中没有快照

推荐答案

每次新数据到达流时,StreamProvider都会重新生成小部件.它的功能类似于ChangeNotificationProvider,它不会生成新的change put,并更新提供程序正在侦听的数据.

dependencies:
  flutter:
    sdk: flutter
  provider: ^6.0.2

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(
    const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return
    StreamProvider<ModelObject>(
      initialData: ModelObject(value:0),
      create:(_)=>createStream(),
      child:  MaterialApp(
        home: Test_StreamProviderWidget(),
      ));
    
  }
}

class ModelObject{

  ModelObject({this.value});
  int ? value;
}
Stream<ModelObject> createStream(){
  return 
  Stream<ModelObject>.periodic( Duration(seconds:1), (currentPeriodicValue)=>ModelObject(value:currentPeriodicValue+1)).take(10000);
}

class Test_StreamProviderWidget extends StatefulWidget {
  Test_StreamProviderWidget({Key? key}) : super(key: key);

  @override
  State<Test_StreamProviderWidget> createState() => _Test_StreamProviderWidgetState();
}

class _Test_StreamProviderWidgetState extends State<Test_StreamProviderWidget> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(appBar: AppBar(title:Text("stream provider")),body:
    Consumer<ModelObject>(
      builder:(context, model, child) {
        return 
        Center(child:Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
        
        Text('${model.value.toString()}',style: Theme.of(context).textTheme.headline2,)

        ],));
        
      },
    
    )
    )
    ;
  }
}

Flutter相关问答推荐

文本未设置在集装箱摆动的中心

将CLOUD_FIRESTORE程序包更新到版本4.13.0(到Windows)时出现问题

Flex ListView用于可滚动和响应的页面

Flutter Riverpod,将默认的BTC值改写为我的新状态

BoxConstraints强制使用无限宽度(列中的Listview)

如何使用flutter_local_notification包处理通知操作?

Flutter 块消费者仅对特定的状态属性更改做出react

Flutter 构建 Web 分段故障 - 无法启动事件处理程序线程

无法应用插件com.chaquo.python

即使小部件比Flutter 中的屏幕更宽,也始终显示滚动条

Dart:未捕获错误:RangeError(索引):索引超出范围:索引应小于 7:7

PreferredSizeWidget类不能用作混合,因为它既不是混合类也不是混合

如何使这种相机叠加在Flutter 中?

你如何在 Flutter 中组合两个数组?

为什么 orientation == Orientation.portrait 总是正确的,尽管我的设备已经处于横向

如何在椭圆形图像周围添加边框?Flutter

我的主屏幕上的 FutureBuilder 不断重新加载(但仅在其他屏幕上时)?

Flutter Desktop,如何获取windows用户配置文件名称?

使用 hydrad_bloc 的预览包

如何验证位于 PageView 内不同页面的 TextFormFields