如何在Flutter中显示initState上的数据?

How to display data on initState in Flutter?

我是新手,谁能回答我的问题。 我正在通过从 Java 到 Flutter 的跨平台从蓝牙获取数据。 我遇到的问题是,当我单击某个按钮时,我只会获取数据并显示在 flutter UI 中,但我必须在初始状态下显示数据。 在页面加载时发生了什么或我应该如何获取数据。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:convert';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
 
  static const recvMsg = const MethodChannel('simpleReceiveChannel');


  String fromBle = "waiting for message";
  String _receivedMsg = "waiting to receive....";
  Future<void> receivingMsg() async {
    try {
      var result = await recvMsg.invokeMethod('receiveMsgFunction');
      _receivedMsg = result;
      print("Result of Receiving: $result");
    } on PlatformException catch (e) {
      print("error + '${e.message}' ");
    }
    setState(() {
      fromBle = _receivedMsg;
    });
  }
  


  @override
  void initState() {
    super.initState();
    receivingMsg();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
        child: Column(
      children: [
        ElevatedButton(
          child: Text('Refresh'),
          onPressed: () {
            receivingMsg();
          },
        ),
        Text(fromBle),
      ],
    ));
  }
}
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
//import 'dart:convert';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  static const recvMsg = const MethodChannel('simpleReceiveChannel');
  String fromBle = "waiting for message from Bluetooth";
  //String _receivedMsg = "waiting to receive....";
  bool isData = false;
  Future<void> receivingMsg() async {
    try {
      var result = await recvMsg.invokeMethod('receiveMsgFunction');
      if (result == null) {
        isData = false;
      } else {
        isData = true;
      }
      // _receivedMsg = result;
      fromBle = result;

      print("Result of Receiving: $result");
    } on PlatformException catch (e) {
      print("error + '${e.message}' ");
    }
    setState(() {
      isData = true;
      // fromBle = _receivedMsg;
    });
  }
 
  @override
  void initState() {
    super.initState();
    receivingMsg();
  }

  Widget noDataScreen() {
    return Text("Data yet to receive");
  }

  Widget dataScreen() {
    return FutureBuilder(
      future: receivingMsg(),
      builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
        return Center(
            child: Column(
          children: [
            ElevatedButton(
              child: Text('Refresh'),
              onPressed: () {
                receivingMsg();
              },
            ),
            Text(fromBle),
          ],
        ));
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return isData ? dataScreen() : noDataScreen();
  }
}

使用未来的构建器将您的中心小部件包装在构建方法中,并在未来调用该方法而不是单击按钮。

喜欢

FutureBuilder(
  future: receivingMsg(),
  builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
    return Center(
        child: Column(
          children: [
            ElevatedButton(
              child: Text('Refresh'),
              onPressed: () {
                receivingMsg();
              },
            ),
            Text(fromBle),
          ],
        ));
  },);