【发布时间】:2020-04-10 04:39:30
【问题描述】:
我想在获取数据时加载事件列表并显示加载指示器。
我正在尝试 Provider 模式(实际上是重构现有应用程序)。
因此,事件列表显示是根据提供程序中管理的状态有条件的。
问题是当我太快调用notifyListeners() 时,我得到了这个异常:
════════基础库捕获的异常════════
在为 EventProvider 发送通知时抛出以下断言:
在构建期间调用 setState() 或 markNeedsBuild()。
...
EventProvider 发送通知是:“EventProvider”的实例
════════════════════════════════════════
在调用notifyListeners() 之前等待几毫秒来解决问题(请参阅下面提供程序类中的注释行)。
这是一个基于我的代码的简单示例(希望不要过于简化):
主要功能:
Future<void> main() async {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => LoginProvider()),
ChangeNotifierProvider(create: (_) => EventProvider()),
],
child: MyApp(),
),
);
}
根小部件:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final LoginProvider _loginProvider = Provider.of<LoginProvider>(context, listen: true);
final EventProvider _eventProvider = Provider.of<EventProvider>(context, listen: false);
// load user events when user is logged
if (_loginProvider.loggedUser != null) {
_eventProvider.fetchEvents(_loginProvider.loggedUser.email);
}
return MaterialApp(
home: switch (_loginProvider.status) {
case AuthStatus.Unauthenticated:
return MyLoginPage();
case AuthStatus.Authenticated:
return MyHomePage();
},
);
}
}
主页:
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final EventProvider _eventProvider = Provider.of<EventProvider>(context, listen: true);
return Scaffold(
body: _eventProvider.status == EventLoadingStatus.Loading ? CircularProgressIndicator() : ListView.builder(...)
)
}
}
事件提供者:
enum EventLoadingStatus { NotLoaded, Loading, Loaded }
class EventProvider extends ChangeNotifier {
final List<Event> _events = [];
EventLoadingStatus _eventLoadingStatus = EventLoadingStatus.NotLoaded;
EventLoadingStatus get status => _eventLoadingStatus;
Future<void> fetchEvents(String email) async {
//await Future.delayed(const Duration(milliseconds: 100), (){});
_eventLoadingStatus = EventLoadingStatus.Loading;
notifyListeners();
List<Event> events = await EventService().getEventsByUser(email);
_events.clear();
_events.addAll(events);
_eventLoadingStatus = EventLoadingStatus.Loaded;
notifyListeners();
}
}
有人可以解释发生了什么吗?
【问题讨论】:
标签: flutter dart flutter-provider