我在我的代码中有这一部分,我想在整个项目中重复,我希望能够在其他地方调用这个函数,但问题是,你需要将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
}
},
);
}
您可以为此指定一个构建器参数
// 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
},
),
如果你使用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);