Flutter 颤振-从websocket消息动态创建小部件-未处理的异常:构造函数中调用了setState()

Flutter 颤振-从websocket消息动态创建小部件-未处理的异常:构造函数中调用了setState(),flutter,dart,websocket,Flutter,Dart,Websocket,当我从websocket接收数据时,我想动态添加一个ListTile。 当我将新数据添加到全局列表时,ListView似乎还没有准备好 我犯了这个错误 [错误:flatter/shell/common/shell.cc(242)]Dart未处理异常:在构造函数中调用setState():_MyHomePageState#4c6c6(生命周期状态:已创建,无小部件,未装入) 处理此代码时出错 void addItem(Item item) { setState(() { i

当我从websocket接收数据时,我想动态添加一个ListTile。 当我将新数据添加到全局列表时,ListView似乎还没有准备好

我犯了这个错误

[错误:flatter/shell/common/shell.cc(242)]Dart未处理异常:在构造函数中调用setState():_MyHomePageState#4c6c6(生命周期状态:已创建,无小部件,未装入)

处理此代码时出错

  void addItem(Item item) {
    setState(() {
      items.add(item);
    });
  }
我尝试应用这些解决方案,但没有一个对我有效:

这是我的测试应用程序:

依赖关系

dependencies:
  flutter:
    sdk: flutter
  web_socket_channel: ^2.0.0
  intl: ^0.17.0
主飞镖

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:test_add_from_websocket/Item.dart';
import 'package:test_add_from_websocket/websocket.dart';

void main() {
  runApp(MyApp());
}

Future _init() async {
  final WebSocket _socket = WebSocket();
  _socket.connect('wss://echo.websocket.org', connectionListener, messageListener);
}

void connectionListener(WebSocket socket, bool connected) {
  print('Status : ' + (connected ? 'Connected' : 'Failed to connect'));
}

void messageListener(WebSocket socket, String message) {
  print('websocket received: $message');
  Map itemMap = jsonDecode(message);
  var _item = Item.fromJson(itemMap);
  MyHomePage().addItem(_item);
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Test',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FutureBuilder(
        future: _init(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            return MyHomePage();
          } else {
            return Text('Loading');
          }
        },
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();

  void addItem(Item item) {
    _MyHomePageState().addItem(item);
  }
}

class _MyHomePageState extends State<MyHomePage> {
  void addItem(Item item) {
    setState(() {
      items.add(item);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Add from websocket event'),
      ),
      body: ListView.builder(
          itemCount: items.length,
          itemBuilder: (context, index) {
            return ListTile(
              leading: Icon(Icons.access_time),
              title: Text(items[index].time),
            );
          }),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          DateTime now = DateTime.now();
          Item _item = Item(
            time: DateFormat.Hm().format(now),
          );
          print(_item.time);
          final WebSocket _socket = WebSocket();
          _socket.send(jsonEncode(_item));
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
还有我的项目类

class Item {
  final String time;

  Item({this.time});

  Item.fromJson(Map<String, dynamic> json) : time = json['time'];
  Map<String, dynamic> toJson() => {'time': time};
}

List<Item> items = [
  Item(time: '10:22'),
  Item(time: '11:22'),
];
类项目{
最终串时间;
项目({this.time});
fromJson(映射json):time=json['time'];
映射到JSON()=>{'time':time};
}
列表项=[
项目(时间:'10:22'),
项目(时间:'11:22'),
];

谢谢

问题是您正在调用
addItem
,它调用
setState
,但是调用它时还没有状态

尝试将全局函数移动到state类,并从initState调用它们

class Item {
  final String time;

  Item({this.time});

  Item.fromJson(Map<String, dynamic> json) : time = json['time'];
  Map<String, dynamic> toJson() => {'time': time};
}

List<Item> items = [
  Item(time: '10:22'),
  Item(time: '11:22'),
];