Flutter 使用流生成器创建列表视图

Flutter 使用流生成器创建列表视图,flutter,dart,Flutter,Dart,要使用流从服务器的实时数据创建列表视图, 因此,在ListTile中使用该列表并运行应用程序时,请创建假数据流,然后将其快照保存在列表中以测试结果。获取以下错误: 在生成ListTile(脏)时引发了以下断言: 找不到任何重要的小部件 ListTile小部件需要材质小部件祖先 void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildConte

要使用流从服务器的实时数据创建列表视图, 因此,在ListTile中使用该列表并运行应用程序时,请创建假数据流,然后将其快照保存在列表中以测试结果。获取以下错误:

在生成ListTile(脏)时引发了以下断言: 找不到任何重要的小部件

ListTile小部件需要材质小部件祖先

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,
);
}
},
),
),