【问题标题】:how to create instances of StreamBuilder<UserModel>如何创建 StreamBuilder<UserModel> 的实例
【发布时间】:2026-01-30 17:30:01
【问题描述】:

我的代码中有这部分我想在整个项目中重复,我希望能够在其他地方调用这个函数,但问题是你需要将snapshot.data 传递给widget树,有什么想法吗?

Widget UserStreamBuilderShortcut(BuildContext context, Widget widget){

  final _user = Provider.of<UserModel>(context);

  return

    StreamBuilder<UserModel>(
      stream: UserProvider(userID: _user.userID).userData,
      builder: (context, snapshot){
        if(snapshot.hasData == false){
          return LoadingFullScreenLayer();
        } else {
          UserModel userModel = snapshot.data; // cant pass this to instances of UserStreamBuilderShortcut Widget
          return
            widget; // in instances of this UserStreamBuilderShortcut we need to be able to pass snapshot.data here
        }
      },
    );

}

【问题讨论】:

    标签: flutter dart stream-builder


    【解决方案1】:

    您可以为此指定一个构建器参数

    // define a Function type that takes a BuildContext and UserModel
    // and returns a Widget
    typedef UserModelWidgetBuilder = Widget Function(
      BuildContext context,
      UserModel userModel,
    );
    
    // pass it as a parameter in the shortcut function
    Widget UserStreamBuilderShortcut({
      BuildContext context,
      UserModelWidgetBuilder builder,
    }) {
      final _user = Provider.of<UserModel>(context);
    
      return StreamBuilder<UserModel>(
        stream: UserProvider(userID: _user.userID).userData,
        builder: (context, snapshot) {
          if (snapshot.hasData == false) {
            return LoadingFullScreenLayer();
          } else {
            UserModel userModel = snapshot.data;
            return builder(context, userModel);
          }
        },
      );
    }
    

    现在你可以这样称呼它:

    UserStreamBuilderShortcut(
      context: context,
      builder: (context, UserModel userModel) {
        return Container(); // create widget with UserModel
      },
    ),
    

    【讨论】:

    • 完美专业超棒的解决方案谢谢Master Coder,我要称你为Code大师,sn-ps之王,Flutter小部件之王
    • @RagehElAzzazy 哈哈哈,很高兴我能帮上忙 :)
    【解决方案2】:

    如果您使用 Provider 包,您可以从其子小部件调用其流参数。

    父小部件:

    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return StreamProvider<BrewList>.value(
          value: Database().brewList,
          child: MaterialApp(
            home: BrewListTile(),
          ),
        );
      }
    }
    

    有权访问流的子小部件。

    class _BrewListState extends State<BrewList> {
      @override
      Widget build(BuildContext context) {
        final brews = Provider.of<List<Brew>>(context) ?? [];
        return Text(brews[0].text);
    

    【讨论】: