使用 Flutter Provider 时,SignalR 客户端颤振库在另一个小部件中显示空值

Posted

技术标签:

【中文标题】使用 Flutter Provider 时,SignalR 客户端颤振库在另一个小部件中显示空值【英文标题】:SignalR client flutter library shows null values in another widget when using Flutter Provider 【发布时间】:2020-05-28 22:04:42 【问题描述】:

我正在尝试使用颤振连接 SignalR 服务器,并且我尝试使用 Provider 访问来自另一个 Widget 的数据,但我收到一个空值。这是 Flutter 正在使用的 SignalR 库。

下面是我的 Class,它扩展了 ChangeNotifier

class BreakingNewsSignalRClient with ChangeNotifier 
  String  _breakingNews;

  Future<void> getBreakingNews() async 
    final hubConnection = HubConnectionBuilder()
        .withUrl('https://services.xxxx.com/breakingNews')
        .build();
      await hubConnection.start();
      hubConnection.on("UpdateBreakingNews", (data)

        _breakingNews = data.toString();
        print(data.toString());

        notifyListeners();
      );
      hubConnection.onclose((error) => print("Connection Closed"));


  

  String get breakingNewsFunction => _breakingNews;


class BreakingNewsModel 
  final String News;
  BreakingNewsModel(this.News);

正如您在上面的代码中看到的,我有一个 getter String get breakingNewsFunction =&gt; _breakingNews;,它在另一个有状态的小部件中被调用以填充来自 SignalR 服务器的一些数据,但是它在另一个小部件中返回 null,但是,当您尝试print data here in getBreakingNews 方法显示数据。

下面是另一个接收数据的 Widget 类:

class BreakingNews extends StatefulWidget 
  const BreakingNews(Key key, @required this.article, @required this.index)
      : super(key: key);
  final Article article;
  final int index;

  @override
  _BreakingNewsState createState() => _BreakingNewsState();





class _BreakingNewsState extends State<BreakingNews> 


  settings() async
    var breakingNewsInfo =
    Provider.of<BreakingNewsSignalRClient>(context, listen: false);

    await breakingNewsInfo.getBreakingNews();

    print('lets see -- $breakingNewsInfo.breakingNewsFunction');
  

  @override
  void initState() 
    // TODO: implement initState
    settings();
    super.initState();
  

因此,当您查看print('lets see -- $breakingNewsInfo.breakingNewsFunction'); 这一行时,它会打印 null,我仍然想知道这里做错了什么。

请大家帮忙。

【问题讨论】:

【参考方案1】:

你试过data[0]吗?

你会写吗?

_breakingNews = data[0].toString(); 

而不是

_breakingNews = data.toString(); 

【讨论】:

【参考方案2】:

这很简单。您的 Future&lt;void&gt; getBreakingNews() async 返回 void,因此返回 null。只需将返回类型调整为您需要的任何类型。

编辑:

实际上,问题是你没有在这里调用你的getter。

await breakingNewsInfo.getBreakingNews();

所以要么从函数中返回结果,要么调用 getter。两者都应该工作。

【讨论】:

嘿,Benedikt,感谢您的回复,好吧,可以说我使方法可返回,我将如何将返回的数据附加到 getter,也许您可​​以给我一个说明,使用我共享的代码.谢谢 getter 是打印中的print('lets see -- $breakingNewsInfo.breakingNewsFunction'); 我怎么能在这里调用getter,await breakingNewsInfo.getBreakingNews();,有点困惑? @IdrisStack 抱歉,我误读了您的代码。我现在再次检查。 @IdrisStack 在运行breakingNewInfo.getBreakinfNews(); 后,变量得到更新。所以吸气剂应该工作

以上是关于使用 Flutter Provider 时,SignalR 客户端颤振库在另一个小部件中显示空值的主要内容,如果未能解决你的问题,请参考以下文章

使用上下文和观察更改模型时,Flutter Provider 不会触发重建

如何在 Flutter 中使用 Provider 正确获取 API

在 Flutter 中使用 Provider 更新和动画化 AnimatedList

SIG Cloud Provider Alibaba 网研会第 2 期顺利召开 | 云原生生态周报

国内首个 Kubernetes SIG-Cloud-Provider 子项目揭秘 | 云原生生态周报 Vol. 37

Flutter - Provider 变量更改时触发导航