Flutter 使用提供程序值抖动初始路径

Flutter 使用提供程序值抖动初始路径,flutter,dart,flutter-provider,flutter-navigation,Flutter,Dart,Flutter Provider,Flutter Navigation,我刚开始使用provider作为flutter的状态管理。我在提供程序中有一个值,用于初始登录isLogin将返回true或false,这取决于它将用户重定向到主页或登录页。我得到的错误如下: 在此MyApp小部件上方找不到正确的提供程序 另外,这是进行身份验证的好方法还是有更好的方法。我正在使用LaravelAPI进行身份验证 Main.dart void main() { runApp(MyApp()); } @override Widget build(BuildContext co

我刚开始使用provider作为flutter的状态管理。我在提供程序中有一个值,用于初始登录isLogin将返回true或false,这取决于它将用户重定向到主页或登录页。我得到的错误如下:

在此MyApp小部件上方找不到正确的提供程序

另外,这是进行身份验证的好方法还是有更好的方法。我正在使用LaravelAPI进行身份验证

Main.dart

void main() {
  runApp(MyApp());
}

@override
Widget build(BuildContext context) {
  return ChangeNotifierProvider<UserProvider>(
      create: (context) => UserProvider(),
      child: MaterialApp(
      initialRoute:Provider.of<UserProvider>(context,listen:false).isLogin?'/':'/login',
      routes: {
        '/':(_)=>HomePage(),
        '/donation-history':(_)=>DonationHistoryPage(),
        '/login':(_)=>LoginPage(),
        '/new-donation':(_)=>NewDonation()
      },
      debugShowCheckedModeBanner:false,
      title: 'RedHero',
      theme: ThemeData(
        primaryColor: kPrimaryColor,
        accentColor: Colors.white,
        scaffoldBackgroundColor: kBackgroundColor,
        fontFamily: "Poppins",
        textTheme: TextTheme(
          bodyText1: TextStyle(color: kBodyTextColor)
        )
      ),
    ),
  );
}
void main(){
runApp(MyApp());
}
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider(
create:(context)=>UserProvider(),
孩子:MaterialApp(
initialRoute:Provider.of(context,listen:false).isLogin?'/':'/login',
路线:{
“/”:())=>HomePage(),
“/捐赠历史记录”:()=>DonationHistoryPage(),
“/login”:()=>LoginPage(),
“/new generation”:(_)=>newgeneration()
},
debugShowCheckedModeBanner:false,
标题:“红英雄”,
主题:主题数据(
primaryColor:kPrimaryColor,
颜色:颜色。白色,
脚手架背景颜色:kBackgroundColor,
fontFamily:“罂粟”,
textTheme:textTheme(
bodyText1:TextStyle(颜色:kBodyTextColor)
)
),
),
);
}
损坏的模式是:

class OuterWidget:无状态小部件{
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider(
…提供程序(上下文)。。。
);
}
}
问题是,
Provider.of
接收传递给
build
函数的相同
context
。在该上下文中,
ChangeNotifierProvider
不存在;提供程序仅添加到子构建上下文中,子构建上下文是在构建子小部件时创建的

如果不清楚,想象一下将提供的对象提取到变量中(这不会改变代码的含义):

class OuterWidget:无状态小部件{
@凌驾
小部件构建(构建上下文){
final something=Provider.of(上下文);
返回ChangeNotifierProvider(
某物
);
}
}
现在很明显,我们正在尝试使用一个尚未提供的对象

因此,一种解决方案是将内部部件拆分为一个单独的小部件:

class OuterWidget:无状态小部件{
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider(
…InnerWidget()。。。
);
}
}
类InnerWidget:无状态Widget{
@凌驾
小部件构建(构建上下文){
返回…提供程序(上下文)。。。;
}
}
此小部件将接收一个新的子上下文,提供程序确实存在于该子上下文中

另一种解决方案是使用a,它正好适用于此场景:

class OuterWidget:无状态小部件{
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider(
...
消费者(建筑商:(u,某物,u)=>…某物…)
...
);
}
}

现在,
Consumer
的子级的构建被延迟到
builder
方法,因此该方法也会接收到提供者存在的构建上下文。

没关系,但是我最初的问题如何?我找不到错误,我检查了小部件树,提供商位于我所有路由@unit的顶部。上面的小部件属于MyApp@Uni