如何解决我如何在我的 Flutter 中实现 Provider
所以每当我尝试调用我的公告屏幕页面时我都会遇到这个错误:
以下断言被抛出,构建了AnnouncementScreen(dirty,dependencies: [_InheritedProviderScope]): 尝试使用具有 Listenable/Stream (Announcements) 子类型的 Provider。
这可能是一个错误,因为 Provider 不会自动更新依赖项 当公告更新时。相反,考虑更改 Provider 以获得更具体的信息 处理更新机制的实现,例如:
- ListenableProvider
- ChangeNotifierProvider
- ValueListenableProvider
- 流提供者
或者,如果您要创建自己的提供程序,请考虑使用 InheritedProvider。
如果您认为这不是错误,可以通过设置禁用此检查
在主文件中将 Provider.debugCheckInvalidValueType 设置为 null
:
void main() {
Provider.debugCheckInvalidValueType = null;
runApp(MyApp());
}
所以我有一个叫做公告的提供者:
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import '../models/announcement_model.dart';
class Announcements with ChangeNotifier {
List _items = [];
String? token;
Announcements(this.token,this._items);
List get items {
return [..._items];
}
Future<void> fetchAnnouncements() async {
String url = "https://api-staging.xxx/announcements";
try {
final response = await http.get(
Uri.parse(url),headers: {HttpHeaders.authorizationHeader: token!},);
final extractedData = json.decode(response.body);
final List loadedProducts = [];
extractedData.forEach((prodId,data) {
loadedProducts.add(
Announcement(id: prodId,title: data['title'],body: data['body']));
});
_items = loadedProducts;
notifyListeners();
} catch (e) {
throw (e);
}
}
}
所以我有一个announcement_screen 基本上可以将所有项目数据从公告中提取到列表中。
这是我的 main.dart 文件(它返回这个 MultiProvider):
MultiProvider(
providers: [
ChangeNotifierProvider.value(
value: Auth(),),ProxyProvider<Auth,Announcements>(
update: (_,auth,previousProducts) => Announcements(
auth.token,previousProducts == null ? [] : previousProducts.items,],child: Consumer<Auth>(
builder: (ctx,_) => MaterialApp(
title: 'XXX',theme: ThemeData(),home: NavigationScreen(),);
这是我在announcement_screen.dart中使用Provider的方式(只关注Provider的用法):
class AnnouncementScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final announcementData = Provider.of<Announcements>(context);
return Scaffold(
backgroundColor: Color(0xff1e1e1e),body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(8.0),child: Column(
children: [
SizedBox(
height: 90,Text(
'Good Morning,John',style: TextStyle(
fontSize: 32,fontFamily: 'Casper',color: Color.fromRGBO(247,245,232,1),SizedBox(
height: 10,Expanded(
child: SizedBox(
height: 200.0,child: FutureBuilder(
future: Provider.of<Announcements>(context)
.fetchAnnouncements(),builder: (ctx,snapshot) => snapshot.connectionState ==
ConnectionState.waiting
? Center(child: CircularProgressIndicator())
: ListView.builder(
itemCount: announcementData.items.length,itemBuilder: (context,index) {
return Column(
children: [
_tile(announcementData.items[index].title,announcementData.items[index].body),Divider(
thickness: 4,indent: 0,endIndent:
MediaQuery.of(context).size.width / 1.4,color: Color.fromRGBO(198,158,96,);
}),DiamondButton(),SizedBox(
height: 20,)
],);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。