我试图用flutter连接SignalR服务器,我试图使用Provider访问数据,这些数据来自另一个Widget,但收到的是一个空值。这是 讯号 我正在使用的flutter的库。
下面是我的 级别 延伸出 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 => _breakingNews;
在另一个有状态的Widget中调用它来填充一些来自SignalR服务器的数据,但它在另一个Widget中返回null,然而,当你试图在这里打印数据时,在 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,我还是想知道我做错了什么。
善意的需要一些帮助。
这是很简单的。你的 Future<void> getBreakingNews() async
返回void,因此为null。只要将返回类型调整为你需要的任何类型即可。
编辑一下
实际上,问题在于你没有调用你的getter。
await breakingNewsInfo.getBreakingNews();
所以要么从函数中返回你的结果,要么调用getter。两者都应该可以。