Flutter 供应商和消费者问题
我对Flatter还比较陌生,我正试图用provider软件包提升我的状态管理技能。我在加载类别和通知听众何时显示类别小部件而不是modalprogressHUD时遇到了一些困难 以下是MyApp类:Flutter 供应商和消费者问题,flutter,dart,provider,Flutter,Dart,Provider,我对Flatter还比较陌生,我正试图用provider软件包提升我的状态管理技能。我在加载类别和通知听众何时显示类别小部件而不是modalprogressHUD时遇到了一些困难 以下是MyApp类: class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeN
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<LoginProvider>(
create: (_) => LoginProvider(),
),
ChangeNotifierProvider<CatergoryProvider>(
create: (_) => CatergoryProvider(),
),
ChangeNotifierProvider<RegistrationProvider>(
create: (_) => RegistrationProvider(),
),
ChangeNotifierProvider<QuestionProvider>(
create: (_) => QuestionProvider(),
),
],
child: MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData.dark().copyWith(
primaryColor: Colors.teal,
),
initialRoute: DashBoard.id,
routes: {
WelcomeScreen.id: (context) => WelcomeScreen(),
DashBoard.id: (context) => DashBoard(),
QuizzPage.id: (context) => QuizzPage()
},
),
);
}
}
发生的异常:
Exception has occurred.
FlutterError (A CatergoryProvider was used after being disposed.
Once you have called dispose() on a CatergoryProvider, it can no longer be used.)
在您的消费者上,在
builder:
内调用fetchCatergory
,在fetchCatergory
内调用调用notifyListeners()
的方法调用函数,每次调用notifyListeners()
,就会调用builder:
,导致无限循环
仅当getList()
返回null且isLoading()
为false时,才尝试包装catergory.fetchCatergory()
代码:
消费者(
生成器:(上下文、类别、子级){
如果(!catergory.isLoading()&&catergory.getList()==null){
catergory.fetchCatergory();
}
catergories=catergory.getList();
return catergory.isLoading()
?ModalProgressHUD(
不透明度:0,
inAsyncCall:
Provider.of(context.isLoading(),
子:Scaffold())
:
类别页面(类别、上下文);
},
),
在消费者内部builder:
调用fetchCatergory
,在fetchCatergory
内部调用调用notifyListeners()
的方法调用函数,每次调用notifyListeners()
,就会调用builder:
,导致无限循环
仅当getList()
返回null且isLoading()
为false时,才尝试包装catergory.fetchCatergory()
代码:
消费者(
生成器:(上下文、类别、子级){
如果(!catergory.isLoading()&&catergory.getList()==null){
catergory.fetchCatergory();
}
catergories=catergory.getList();
return catergory.isLoading()
?ModalProgressHUD(
不透明度:0,
inAsyncCall:
Provider.of(context.isLoading(),
子:Scaffold())
:
类别页面(类别、上下文);
},
),
有效谢谢你,我怎么会收到图书馆调用的另一个异常。这与生成期间调用的setState()或markNeedsBuild()有关。它是在catergoryprovider类的setLoading方法中被捕获的,还说这个有问题的调用是在consumerworks中进行的谢谢,我是如何收到库调用的另一个异常的。这与生成期间调用的setState()或markNeedsBuild()有关。catergoryprovider类中的setLoading方法中捕获了它,并且还表示该违规调用是在消费者中进行的
Consumer<CatergoryProvider>(
builder: (context, catergory, child) {
catergory.fetchCatergory();
catergories = catergory.getList();
return catergory.isLoading()
? ModalProgressHUD(
opacity: 0,
inAsyncCall:
Provider.of<CatergoryProvider>(context).isLoading(),
child: Scaffold())
: catergoryPage(catergories, context);
},
),
════════ Exception caught by foundation library ════════════════════════════════
setState() or markNeedsBuild() called during build.
════════════════════════════════════════════════════════════════════════════════
════════ Exception caught by foundation library ════════════════════════════════
setState() or markNeedsBuild() called during build.
════════════════════════════════════════════════════════════════════════════════
Exception has occurred.
FlutterError (A CatergoryProvider was used after being disposed.
Once you have called dispose() on a CatergoryProvider, it can no longer be used.)
Consumer<CatergoryProvider>(
builder: (context, catergory, child) {
if(!catergory.isLoading() && catergory.getList() == null) {
catergory.fetchCatergory();
}
catergories = catergory.getList();
return catergory.isLoading()
? ModalProgressHUD(
opacity: 0,
inAsyncCall:
Provider.of<CatergoryProvider>(context).isLoading(),
child: Scaffold())
:
catergoryPage(catergories, context);
},
),