【发布时间】:2021-06-09 04:33:02
【问题描述】:
我正在学习 Flutter,但有些东西我无法理解。
我用一个包(infine_scroll_pagination)实现了一个无限滚动分页,
它工作正常,但这个Package 获取的数据来自Future 调用,它从WEB 获取数据,并在我的Provider Class 中解析它。
我的问题是,Infinite Scroll widget 加载的data 在其state 中的其他任何地方都无法访问。
示例:
让我们以 contact list 为例,它一次加载 10 个联系人:
class ContactsBody extends StatefulWidget {
@override
_ContactsBodyState createState() => _ContactsBodyState();
}
class _ContactsBodyState extends State<ContactsBody> {
static const _pageSize = 10;
final PagingController<int, Contact> pagingController =
PagingController(firstPageKey: 0);
@override
void initState() {
super.initState();
pagingController.addPageRequestListener((pageKey) {
_fetchPage(pageKey);
});
}
Future<void> _fetchPage(int pageKey) async {
try {
final newItems = await ContactsService().fetchContactsPaged(pageKey, _pageSize);
final isLastPage = newItems.length < _pageSize;
if (isLastPage) {
pagingController.appendLastPage(newItems.contacts);
} else {
final nextPageKey = pageKey + 1;
pagingController.appendPage(newItems.contacts, nextPageKey);
}
} catch (error) {
pagingController.error = error;
}
}
@override
Widget build(BuildContext context) {
return ContactsList(pagingController);
}
@override
void dispose() {
pagingController.dispose();
super.dispose();
}
所以基本上这个 Infinite Scroll 包将获取我的联系人,一次 10 个,这里是我的ContactsService 电话:
Future<Contacts> fetchContactsPaged(int pageKey, int pageSize) async {
final response = await http.get(.....);
if (response.statusCode == 200) {
return Contacts.fromJson(jsonDecode(response.body));
} else {
throw Exception('Failed to load contacts');
}
}
最后,正如您在上面看到的,它使用其工厂方法“fromJson()”初始化我的Provider class(联系人),并返回parsed data。
现在是我的Provider class:
class Contacts extends ChangeNotifier {
List<Contact> _contacts = <Contact>[];
Contacts();
factory Contacts.fromJson(final Map<String, dynamic> json) {
final Contacts contacts = Contacts();
if (json['data'] != null) {
json['data'].forEach((contact) {
contacts.add(Contact.fromJson(contact));
});
}
return contacts;
}
void add(final Contact contact) {
this._contacts.add(contact);
this.notifyListeners();
}
我在这里遇到的问题是,当Inifinite Scroll listView 被加载时,例如我更改了单个联系人的state(例如可以将联系人设置为收藏夹),
如何访问Contacts() class 的SAME instance,FUTURE 调用已初始化,以便我可以访问该类中数据的current state?
当然,如果我要 POST 我对 API 所做的更改,并在我需要的地方重新获取新值,我会获得数据的更新状态,但我想了解如何在此处访问同一个实例并使当前数据在应用内随处可用
【问题讨论】:
-
我尝试在另一个小部件中调用 Contacts() 但该实例中的数据不一样,所以我遗漏了一些东西,我不知道是什么