【发布时间】:2021-11-30 18:16:22
【问题描述】:
model_album.dart
class Album {
final int userId;
final int id;
final String title;
Album({
required this.userId,
required this.id,
required this.title,
});
factory Album.fromJson(Map<String, dynamic> json) {
return Album(
userId: json['userId'],
id: json['id'],
title: json['title'],
);
}
}
http_controller.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:feed/models/model_album.dart';
class HttpController extends GetxController {
late Future<Album> futureAlbum;
@override
void onInit() {
super.onInit;
futureAlbum = fetchAlbum();
}
Future<Album> fetchAlbum() async {
final response = await http
.get(Uri.parse('https://jsonplaceholder.typicode.com/albums/1'));
if (response.statusCode == 200) {
// If the server did return a 200 OK response,
// then parse the JSON.
debugPrint('futureAlbum initialized');
return Album.fromJson(jsonDecode(response.body));
} else {
// If the server did not return a 200 OK response,
// then throw an exception.
throw Exception('Failed to load album');
}
}
}
view_http.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:feed/views/view_http.dart';
import 'package:feed/models/model_album.dart';
import 'package:feed/controllers/http_controller.dart';
class ViewHttp extends StatelessWidget {
var httpController = HttpController();
@override
Widget build(BuildContext context) {
return Center(
child: FutureBuilder<Album>(
future: httpController.futureAlbum,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data!.title);
} else if (snapshot.hasError) {
return Text('${snapshot.error}');
}
// By default, show a loading spinner.
return const CircularProgressIndicator();
},
));
}
}
我正在尝试学习如何使用 Getx 和网络请求。我从以下代码中获取了此代码: https://flutter.dev/docs/cookbook/networking/fetch-data
我尝试修改以使用 Getx 并得到错误: LateInitializationError:字段“futureAlbum”尚未初始化。 我认为 onInit 方法应该在 view_http.dart 文件中实例化控制器时初始化。想法?
【问题讨论】:
-
late 关键字仅在您确定该值不为空时使用,因此您可以使用
Future<Album?>? futureAlbum; -
谢谢。我添加了它,它是 null 并且没有在
onInit方法中初始化,这是我认为它应该做的。想法?
标签: flutter dart flutter-getx