从几天开始,我正在开发一个flutter应用程序,该应用程序可以从BLE设备接收数据,但是此功能无法在flutter中完成,因此我必须使用java native。我从本机端接收数据,并在事件通道的帮助下对数据进行解码并传输这些数据。现在我正在颤抖地接收那些数据。但是问题是流完成后我的ui更新。 在这里,我所说的流是指完成。假设我每秒每秒从1到5传输数字,然后在颤动侧我收到的值是1然后是2,依此类推。但是我的用户界面没有在流媒体时间更新。但是当流完成时。当flutter收到最后一个数字为五时,则ui更新。 我正在使用提供者multiprovider和使用者,并编写了许多调试打印,据我所知,变量中的值已更改,但ui不会更新。 注意:数据正在从本机端流向抖动端。 注意:如果在设置状态或提供程序小部件中可更改的值发生变化,则构建函数将在开始流之前运行,并在结束流之后运行。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Event Channel Sample',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(title: 'Event and Method Channel Sample'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
static const stream =
const EventChannel('com.yourcompany.eventchannelsample/stream');
int _timer = 0;
StreamSubscription _timerSubscription = null;
void _enableTimer() {
if (_timerSubscription == null) {
_timerSubscription = stream.receiveBroadcastStream().listen(_updateTimer);
}
}
void _disableTimer() {
if (_timerSubscription != null) {
_timerSubscription.cancel();
_timerSubscription = null;
}
}
void _updateTimer(timer) {
debugPrint("Timer $timer");
setState(() => _timer = timer);
}
@override
Widget build(BuildContext context) {
var timerCard = new Card(
child: new Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
const ListTile(
leading: const Icon(Icons.timer),
title: const Text('Event and Method Channel Sample'),
subtitle: const Text('An example application .'),
),
new Center(
child: new Text(
'$_timer',
style: Theme.of(context).textTheme.display1,
),
),
new ButtonTheme.bar(
child: new ButtonBar(children: <Widget>[
new FlatButton(
child: const Text('Enable'),
onPressed: _enableTimer,
),
new FlatButton(
child: const Text('Disable'),
onPressed: _disableTimer,
),
]))
]));
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Container(
padding: new EdgeInsets.all(8.0),
child: timerCard,
));
}
}