Flutter 找不到提供程序-颤振

Flutter 找不到提供程序-颤振,flutter,stream,provider,Flutter,Stream,Provider,我想为我的DecksList小部件提供一个流,所以我在MyApp中初始化了一个提供者。它抛出ProviderNotFoundError。这种行为的原因是什么 I/flutter (27768): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ I/flutter (27768): The following ProviderNotFoundEr

我想为我的DecksList小部件提供一个流,所以我在MyApp中初始化了一个提供者。它抛出ProviderNotFoundError。这种行为的原因是什么

I/flutter (27768): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (27768): The following ProviderNotFoundError was thrown building NotificationListener<KeepAliveNotification>:
I/flutter (27768): Error: Could not find the correct Provider<Stream<List<Deck>>> above this DecksList Widget
I/颤振(27768):══╡ WIDGETS库捕获到异常╞═══════════════════════════════════════════════════════════
I/flatter(27768):在构建NotificationListener时引发了以下ProviderNotFoundError:
I/Flatter(27768):错误:在此DecksList小部件上方找不到正确的提供程序
打开图像以查看MyApp小部件:

DecksList内部主页小部件:

class DecksList extends StatefulWidget {
  @override
  _DecksListState createState() => _DecksListState();
}

class _DecksListState extends State<DecksList> {
  Stream<List<Deck>> decks;

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    decks = Provider.of<Stream<List<Deck>>>(context);
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<Deck>>(
        stream: decks,
        builder: (context, snapshot) {
          final decksList = snapshot.data ?? List();
          return ListView.builder(
//          to scroll lists together
            physics: ClampingScrollPhysics(),
            shrinkWrap: true,
            itemCount: decksList.length,
            itemBuilder: (BuildContext context, int index) {
              final Deck itemDeck = decksList[index];
              return DeckTile(
                deckItem: itemDeck,
                onPressed: () {
                  Navigator.push(context,
                      CupertinoPageRoute(builder: (BuildContext context) {
                    return FlashcardsDeck(
                      deckId: itemDeck.id,
                    );
                  }));
                },
                onLongPress: () {},
              );
            },
          );
        });
  }
}
class DecksList扩展StatefulWidget{
@凌驾
_DecksListState createState()=>\u DecksListState();
}
类_DecksListState扩展状态{
溪流甲板;
@凌驾
void didChangeDependencies(){
super.didChangeDependencies();
decks=上下文的提供者;
}
@凌驾
小部件构建(构建上下文){
返回流生成器(
溪流:甲板,
生成器:(上下文,快照){
最终decksList=snapshot.data??List();
返回ListView.builder(
//将列表滚动到一起
物理:ClampingScrollPhysics(),
收缩膜:对,
itemCount:decksList.length,
itemBuilder:(构建上下文,int索引){
最终甲板项目甲板=甲板列表[索引];
返回地砖(
deckItem:itemDeck,
已按下:(){
Navigator.push(上下文,
CupertinoPageRoute(生成器:(BuildContext上下文){
回传抽认卡(
deckId:itemDeck.id,
);
}));
},
onLongPress:(){},
);
},
);
});
}
}

问题出在摩尔图书馆。
这里有一个问题

您是否通过调用
ChangeNotifierWidget
MultiChilChangeNotifier
初始化了此问题?通常,当您不使用子上下文时,会发生此错误。但奇怪的是,您正在从构建器内部调用
Home()
(因此
DecksList()
),它应该可以工作。您可以尝试将
StreamBuilder
包装到
消费者
中。有状态小部件缓存流值的目的是什么?@user8773560不,我没有t@frank06使有状态小部件在initState中初始化流的目的在于每次DecksList小部件重建时都会重新启动流。使用提供者提供流的目的是解决流的问题restarting@SergiyVergun您如何向提供商注册流?我写道:,也许你会在“更干净的方式”下发现一些有用的东西,而这可以从理论上回答这个问题,在这里包括答案的基本部分,并提供链接供参考。