如何解决Flutter - 在此 ChangeLocation 小部件上方找不到正确的 Provider<Provider>
我在我的应用中同时使用 BlocProvider 和 ChangeNotifierProvider。应用程序的流程在这里:-
- 第一次用户打开应用程序:InstructionPage() -> WelcomePage() -> HomePage() //getting error
- 第二次用户打开应用程序:HomePage() //工作正常
我使用 sharedPreference 来存储 isInstructionPageLoaded 的值。 但是从 WelcomePage() 导航到 HomePage() 时出现错误在此 ChangeLocation 小部件上方找不到正确的提供程序
这是我的代码:-
//main.dart
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await StorageUtil.getInstance();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: Theme.of(context).copyWith(primaryColor: kBgColorGreen),home: MultiBlocProvider(
providers: [
BlocProvider(
create: (context) =>
RestaurantBloc()..add(RestaurantPageFetched())),],child: MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) => LocationServiceProvider()),child: StorageUtil.getBoolValue(
SharedPrefsKeys.isInstructionPageLoaded)
? HomePage()
: InstructionScreen(),)),routes: Routes.getRoutes(),);
}
}
//routes.dart
class Routes {
static const String instruction = '/instruction';
static const String welcome = '/welcome';
static const String home = '/home';
static const String change_location = '/change_location';
static Map<String,WidgetBuilder> getRoutes() {
return {
Routes.instruction: (context) => InstructionScreen(),Routes.welcome: (context) => WelcomePage(),Routes.home: (context) => HomePage(),Routes.change_location: (context) => ChangeLocation(),};
}
}
//location_service.dart
class LocationServiceProvider extends ChangeNotifier {
void toogleLocation(LocationService location) {
location.isLocationUpdated = !location.isLocationUpdated;
notifyListeners();
}
}
class LocationService {
bool isLocationUpdated = false;
}
//welcome_page.dart - 按下按钮调用下面的方法
void _navigatetoHomePage() async {
Navigator.push(context,MaterialPageRoute(builder: (context) {
return BlocProvider(
create: (context) => RestaurantBloc()..add(RestaurantPageFetched()),child: ChangeNotifierProvider(create: (context) => LocationServiceProvider(),child: HomePage(),),);
}));
}
我在上面的方法 becoz 中添加了 BlocProvider 在它给我错误之前 blocprovider.of() 使用不包含从其他屏幕导航的 bloc 的上下文调用,从 WelcomePage() 导航到 HomePage()。
提前致谢!!!
解决方法
为了确保 bloc 暴露给新路由,您需要遵循文档并添加 BlocProvider.value() 以将 bloc 的值提供给新路由。这将承载集团的状态,让您的生活更轻松。
查看 Official Documentations 以获得清晰的分步指南;)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。