Flutter 使用流生成器创建列表视图
要使用流从服务器的实时数据创建列表视图, 因此,在ListTile中使用该列表并运行应用程序时,请创建假数据流,然后将其快照保存在列表中以测试结果。获取以下错误: 在生成ListTile(脏)时引发了以下断言: 找不到任何重要的小部件 ListTile小部件需要材质小部件祖先Flutter 使用流生成器创建列表视图,flutter,dart,Flutter,Dart,要使用流从服务器的实时数据创建列表视图, 因此,在ListTile中使用该列表并运行应用程序时,请创建假数据流,然后将其快照保存在列表中以测试结果。获取以下错误: 在生成ListTile(脏)时引发了以下断言: 找不到任何重要的小部件 ListTile小部件需要材质小部件祖先 void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildConte
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: SafeArea(
child: Center(
child: StreamBuilderPage(),
),
),
);
}
}
class StreamBuilderPage extends StatefulWidget {
@override
_StreamBuilderPageState createState() => _StreamBuilderPageState();
}
class _StreamBuilderPageState extends State<StreamBuilderPage> {
List<int> items = [];
@override
Widget build(BuildContext context) {
return StreamBuilder(
//Error number 2
stream: NumberCreator().stream,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.connectionState == ConnectionState.done) {
return Text('done');
} else if (snapshot.hasError) {
return Text('Error!');
} else {
items.add(snapshot.data);
print(items); //print every second: [0] then [0,1] then [0,1,2] ...
return ListView.builder(
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index].toString()),
);
},
itemCount: items.length,
);
}
},
);
}
}
class NumberCreator {
NumberCreator() {
Timer.periodic(Duration(seconds: 1), (timer) {
//add count to stream
_controller.sink.add(_count);
_count++;
});
}
var _count = 1;
final _controller = StreamController<int>();
Stream<int> get stream => _controller.stream;
dispose() {
_controller.close();
}
}
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:安全区(
儿童:中心(
子项:StreamBuilderPage(),
),
),
);
}
}
类StreamBuilderPage扩展StatefulWidget{
@凌驾
_StreamBuilderPageState createState()=>\u StreamBuilderPageState();
}
类_StreamBuilderPageState扩展状态{
列表项=[];
@凌驾
小部件构建(构建上下文){
返回流生成器(
//错误号2
流:NumberCreator()。流,
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.waiting){
返回循环ProgressIndicator();
}else if(snapshot.connectionState==connectionState.done){
返回文本(“完成”);
}else if(snapshot.hasrerror){
返回文本('Error!');
}否则{
添加(快照数据);
打印(项目);//每秒打印:[0]然后[0,1]然后[0,1,2]。。。
返回ListView.builder(
itemBuilder:(上下文,索引){
返回列表块(
标题:文本(项[索引].toString()),
);
},
itemCount:items.length,
);
}
},
);
}
}
类号生成器{
NumberCreator(){
定时器。周期(持续时间(秒:1),(定时器){
//将计数添加到流
_控制器.接收器.添加(_计数);
_计数++;
});
}
var_计数=1;
最终_controller=StreamController();
Stream get Stream=>\u controller.Stream;
处置{
_controller.close();
}
}
究竟是什么导致了这个错误?
感谢社区。我认为您必须将ListTile嵌入特定于材质的小部件中,例如scaffold。几天前我遇到了一个类似的问题,在某个地方,消息告诉您可以包装哪些小部件来防止此错误我认为您必须将ListTile嵌入到特定于材质的小部件中,例如scaffold。几天前我遇到了一个类似的问题,在某个地方,消息告诉您可以包装哪些小部件来防止此错误
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: StreamBuilderPage(),
);
}
}
class StreamBuilderPage extends StatefulWidget {
@override
_StreamBuilderPageState createState() => _StreamBuilderPageState();
}
class _StreamBuilderPageState extends State<StreamBuilderPage> {
List<int> items = [];
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Center(
child: StreamBuilder(
//Error number 2
stream: NumberCreator().stream,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.connectionState == ConnectionState.done) {
return Text('done');
} else if (snapshot.hasError) {
return Text('Error!');
} else {
items.add(snapshot.data);
print(
items); //print every second: [0] then [0,1] then [0,1,2] ...
return ListView.builder(
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index].toString()),
);
},
itemCount: items.length,
);
}
},
),
),
),
);
}
}
class NumberCreator {
NumberCreator() {
Timer.periodic(Duration(seconds: 1), (timer) {
//add count to stream
_controller.sink.add(_count);
_count++;
});
}
var _count = 1;
final _controller = StreamController<int>();
Stream<int> get stream => _controller.stream;
dispose() {
_controller.close();
}
}
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:StreamBuilderPage(),
);
}
}
类StreamBuilderPage扩展StatefulWidget{
@凌驾
_StreamBuilderPageState createState()=>\u StreamBuilderPageState();
}
类_StreamBuilderPageState扩展状态{
列表项=[];
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:安全区(
儿童:中心(
孩子:StreamBuilder(
//错误号2
流:NumberCreator()。流,
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.waiting){
返回循环ProgressIndicator();
}else if(snapshot.connectionState==connectionState.done){
返回文本(“完成”);
}else if(snapshot.hasrerror){
返回文本('Error!');
}否则{
添加(快照数据);
印刷品(
items);//每秒打印:[0]然后[0,1]然后[0,1,2]。。。
返回ListView.builder(
itemBuilder:(上下文,索引){
返回列表块(
标题:文本(项[索引].toString()),
);
},
itemCount:items.length,
);
}
},
),
),
),
);
}
}
类号生成器{
NumberCreator(){
定时器。周期(持续时间(秒:1),(定时器){
//将计数添加到流
_控制器.接收器.添加(_计数);
_计数++;
});
}
var_计数=1;
最终_controller=StreamController();
Stream get Stream=>\u controller.Stream;
处置{
_controller.close();
}
}
试试这个
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: StreamBuilderPage(),
);
}
}
class StreamBuilderPage extends StatefulWidget {
@override
_StreamBuilderPageState createState() => _StreamBuilderPageState();
}
class _StreamBuilderPageState extends State<StreamBuilderPage> {
List<int> items = [];
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Center(
child: StreamBuilder(
//Error number 2
stream: NumberCreator().stream,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.connectionState == ConnectionState.done) {
return Text('done');
} else if (snapshot.hasError) {
return Text('Error!');
} else {
items.add(snapshot.data);
print(
items); //print every second: [0] then [0,1] then [0,1,2] ...
return ListView.builder(
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index].toString()),
);
},
itemCount: items.length,
);
}
},
),
),
),
);
}
}
class NumberCreator {
NumberCreator() {
Timer.periodic(Duration(seconds: 1), (timer) {
//add count to stream
_controller.sink.add(_count);
_count++;
});
}
var _count = 1;
final _controller = StreamController<int>();
Stream<int> get stream => _controller.stream;
dispose() {
_controller.close();
}
}
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:StreamBuilderPage(),
);
}
}
类StreamBuilderPage扩展StatefulWidget{
@凌驾
_StreamBuilderPageState createState()=>\u StreamBuilderPageState();
}
类_StreamBuilderPageState扩展状态{
列表项=[];
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:安全区(
儿童:中心(
孩子:StreamBuilder(
//错误号2
流:NumberCreator()。流,
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.waiting){
返回循环ProgressIndicator();
}else if(snapshot.connectionState==connectionState.done){
返回文本(“完成”);
}else if(snapshot.hasrerror){
返回文本('Error!');
}否则{
添加(快照数据);
印刷品(
items);//每秒打印:[0]然后[0,1]然后[0,1,2]。。。
返回ListView.builder(
itemBuilder:(上下文,索引){
返回列表块(
标题:文本(项[索引].toString()),
);
},
itemCount:items.length,
);
}
},
),
),