【问题标题】:'Future<dynamic>' has no instance getter 'body' error, when trying to access body of Future SmsMessage variable in Flutter'Future<dynamic>' 没有实例 getter 'body' 错误,当尝试访问 Flutter 中 Future SmsMessage 变量的主体时
【发布时间】:2020-06-01 18:52:15
【问题描述】:

这是一个单独文件中的类

import 'package:sms/sms.dart';

class SmsReader {
  SmsMessage sms;
  dynamic messageRead() async {
    SmsReceiver receiver = SmsReceiver();
    receiver.onSmsReceived.listen((SmsMessage msg) {
      sms = msg;
    });
    return sms;
  }
}

这个文件是创建对象和调用函数的地方

class _HomePageState extends State<HomePage> {

  SmsReader smsReader = SmsReader();
  dynamic sms;

  @override
  void initState() {
    sms = smsReader.messageRead();
    super.initState();
  }

现在当我尝试 print(sms.body),出现这个错误

“Future”类没有实例获取器“body”。 接收者:“未来”的实例 尝试调用:body

【问题讨论】:

    标签: android android-studio flutter asynchronous dart


    【解决方案1】:

    您将messageRead 定义为:

    dynamic messageRead() async {
    

    所有async 函数都应该返回一个Future,你返回的是dynamic,它定义了“这里的每个类型都可以”。

    稍后您在没有await 的情况下调用messageRead,所以它只返回一个Future。你需要把你的代码改成awaitmessageRead

    Future<SmsMessage> messageRead() async {
    
    ...
    
    SmsMessage sms;
    
    ...
    
    smsReader.messageRead().then((newSms) => sms = newSms);
    

    您需要使用then 而不是await,因为您不能在initState 函数中使用await

    【讨论】:

    • 感谢您的回复。在 null 上调用了 getter 'body'。当我尝试在构建中打印sms.body 的值时会发生此错误,即使设备收到了新消息。当 messageRead 函数位于那个 Stful 小部件中时,它曾经可以工作。
    • 这是另一个与您的原始问题无关的问题。我建议您在使用 Future 之前验证 sms 不是 null,因为在调用 build 之前可能还没有完成。您可以使用FutureBuilder 让事情变得更简单。我建议你看看Futures 是如何工作的,在我看来你对它们背后的一般理论感到困惑。
    • 当然。我尝试在 Build 内部的 setState 函数中使用 smsReader.messageRead().then((newSms) =&gt; sms = newSms);,它似乎工作得很好。它仅在initState 中不起作用。我之所以尝试将其添加到 InitState 是因为我希望它无限期地继续运行,并在每次收到新消息时更新。
    • 再次,您需要阅读有关Future 的更多信息。 Future 只运行一次,只有 Stream 会返回多个值。除非你不断地打电话给FutureinitState 不能使用 FutureFuture 结果将在 initState 完成后到达。 initState 只能用于设置Future,以便build 等其他函数可以使用它。
    【解决方案2】:

    做改变

      Future<dynamic> messageRead() async {
        SmsReceiver receiver = SmsReceiver();
          receiver.onSmsReceived.listen((SmsMessage msg) {
            sms = msg;
          });
        return sms;
      }
    

    smsReader.messageRead().then((sms) { 
      //do whatever with sms ******
    });
    

    让我知道它是否有效。

    【讨论】:

    • 谢谢,这行得通!但是当我将 sms 的值存储在另一个变量中时说message = sms,然后print(message.body) 它返回一个空值。
    猜你喜欢
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2021-07-17
    • 2023-02-11
    • 2021-10-05
    • 2020-12-21
    相关资源
    最近更新 更多