Flutter中的流接收数据但ui是否未更新?

时间:2019-12-17 14:36:48

标签: flutter

从几天开始,我正在开发一个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,
        ));
   }
}

0 个答案:

没有答案