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