我正在使用新的Dart版本 >=2.12.0 <3.0.0,并启用了空安全特性。
我添加了我的代码供参考。
MatchesService
import 'package:cric_app/AppUrls.dart';
import 'package:cric_app/features/home/match_model.dart';
import 'package:dio/dio.dart';
import 'package:rxdart/rxdart.dart';
class MatchesService {
// ignore: close_sinks
BehaviorSubject<List<MatchModel>> list = BehaviorSubject<List<MatchModel>>();
Future<List<MatchModel>> getMatches() async {
try {
var matchList = await fetchMatches();
list.add(matchList);
return matchList;
} catch (Exc) {
print(Exc);
}
}
Future<List<MatchModel>> fetchMatches() async {
var dio = Dio();
final response = await dio.post(AppUrls.getMatches);
print(response.data);
final body = response.data['matches'] as List;
return body.map((dynamic json) {
return MatchModel(
id: json['id'] as int,
date: json['date'] as String,
dateGmt: json['dateTimeGMT'] as String,
teamOne: json['team-1'] as String,
teamTwo: json['team-2'] as String,
tossWinnerTeam: json['toss_winner_team'] as String,
matchStarted: json['matchStarted'] as bool,
type: json['type'] as String,
winnerTeam: json['winner_team'] as String,
);
}).toList();
}
}
主屏幕
import 'package:cric_app/components/match_card.dart';
import 'package:cric_app/features/home/match_model.dart';
import 'package:cric_app/features/home/matches_service.dart';
import 'package:cric_app/utils.dart';
import 'package:flutter/material.dart';
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
MatchesService matchesService = MatchesService();
@override
void initState() {
matchesService.getMatches();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: primary_color,
body: SingleChildScrollView(
child: Container(
margin: setMargin(15, 0, 15, 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 30,
),
text('Matches', Colors.white, FontWeight.bold, 23),
SizedBox(
height: 2,
),
text("Today's live matches", Colors.white, FontWeight.bold, 18),
StreamBuilder<List<MatchModel>>(
stream: matchesService.list,
initialData: null,
builder: (context, snapshot) {
if (snapshot.data != null) {
final list = snapshot.data as List;
return ListView.builder(
itemCount: list.length,
itemBuilder: (BuildContext context, int index) {
return matchCard(context, list[index]);
},
);
} else {
return Center(
child: text(
'No live matches now',
Colors.white,
FontWeight.bold,
16,
),
);
}
},
),
SizedBox(
height: 10,
),
],
),
),
),
);
}
}
我遇到了这个错误: The body might complete normally, causing 'null' to be returned, but the return type is a potentially non-nullable type. Try adding either a return or a throw statement at the end.