【发布时间】:2020-07-18 18:57:38
【问题描述】:
首先,对标题感到抱歉,听起来很乱,但我希望有人已经遇到过这个问题。将尝试解释我要在这里实现的目标。
我正在尝试重用 futureBuilder 小部件,因为我的应用有很多列表。
//flutter
import 'package:flutter/material.dart';
class StreamBuilderWidget extends StatelessWidget {
Stream streamFunction;
ScrollController scrollController;
Widget customWidget;
StreamBuilderWidget({
this.streamFunction,
this.scrollController,
this.customWidget,
});
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: streamFunction,
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
case ConnectionState.none:
return Center(child: CircularProgressIndicator());
case ConnectionState.active:
case ConnectionState.done:
if (snapshot.hasData) {
return IgnorePointer(
child: ListView.builder(
controller: scrollController,
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
final item = snapshot.data[index];
return customWidget(item);
//PostItem(item) //example
//VideosItem(item) //example
//BooksItem(item) //example
;
},
),
);
}
}
return Center(
child: CircularProgressIndicator(),
);
},
);
}
}
我的头痛来自于 Widget 参数,我需要接收它自己的参数“item”。
在阅读本文时,似乎很容易,虽然我无法解决它。
一个讨厌的解决方法是用一个字符串参数替换小部件参数,将它与 switch 语句一起使用:
switch (widgetType) {
case 'PostItemWidget':
return PostItemWidget(post: item);
case 'YouTubeItemWidget':
return VideosItem(video: item)
... //and so on
你明白了,无论如何,让它成为一个更清晰/更干净的解决方案会很棒。
如果您需要任何进一步的意见,请告诉我。 提前致谢。
【问题讨论】: