我正在使用Fluttersprovider
库,但在更新UI时遇到问题。我正在执行一个简单的HTTP POST
,如果发生错误,我想更新我的UI。
这是我的提供者中的逻辑:
class DeviceProvider extends ChangeNotifier {
// Enum with possible states: Initial, Loading, Error & Success
APIState state = APIState.Initial;
...
void sendConfig() async {
try {
http.Response postResponse = await http.post(...);
if (postResponse.ok) {
state = APIState.Success;
} else {
state = APIState.Error;
}
} on SocketException catch (e) {
state = APIState.Error;
}
notifyListeners();
}
}
这是我的UI:
return ChangeNotifierProvider<DeviceProvider>(
create: (_) => DeviceProvider(),
child: Consumer<DeviceProvider>(
builder: (_, model, __) {
switch (model.state) {
// Display error
case APIState.Error:
return Text('Error');
// Ignore all other states
case APIState.Loading:
case APIState.Initial:
case APIState.Success:
return const Visibility(
child: Text("Gone"),
visible: false,
);
}
},
),
);
我的main.dart看起来像这样:
void main() => runApp(
MultiProvider(
providers: [
...
ChangeNotifierProvider<DeviceProvider>(create: (_) => DeviceProvider()),
],
child: const MyApp(),
),
);
现在,我知道了一个事实,即代码已经执行,并且状态实际上是Error
。
然而,即使我调用notifyListeners
,我的错误小部件似乎也根本没有得到通知。
我错过了什么?
我认为当您在ui中使用其他更改通知程序提供程序时会出现问题。当您触发send-config函数时,您正在使用您在main.dart中提供的更改通知程序提供程序来触发它。没关系。但是在您的ui中,您将一个使用者附加到另一个未触发send-config的提供者。
修复方法:不要返回ChangeNotificationProvider,而只是返回消费者