flutter - 使用提供者值 flutter 初始路线

标签 flutter dart flutter-provider flutter-navigation

我刚刚开始使用提供程序作为 flutter 的状态管理。我在提供程序中有一个值可用于初始登录。 isLogin 将返回true或false,具体取决于它将用户重定向到主页还是登录页面。我收到以下错误:
在此MyApp小部件上方找不到正确的提供程序
另外,这是进行身份验证的好方法还是有更好的方法。我正在使用laravel API进行身份验证。
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)
        )
      ),
    ),
  );
}

最佳答案

断开的模式是:

class OuterWidget : StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Something>(
      ... Provider.of<Something>(context) ...
    );
  }
}
问题在于Provider.of<Something>接收到与传递给context函数相同的build。在这种情况下,ChangeNotifierProvider不存在;该提供程序仅添加到后代构建上下文中,后者是在构建子窗口小部件时创建的。
如果不清楚,请想象将提供的对象提取到一个变量中(不会改变代码的含义):
class OuterWidget : StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final something = Provider.of<Something>(context);
    return ChangeNotifierProvider<Something>(
      ... something ...
    );
  }
}
现在很明显,我们正在尝试使用一个尚未提供的对象。
因此,一种解决方案是将内部拆分为单独的小部件:
class OuterWidget : StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Something>(
      ... InnerWidget() ...
    );
  }
}

class InnerWidget : StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ... Provider.of<Something>(context) ...;
  }
}
此小部件将接收提供者确实存在的新子上下文。
另一种解决方案是使用 Consumer widget,它恰好在这种情况下存在:
class OuterWidget : StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Something>(
      ...
      Consumer<Something>(builder: (_, something, __) => ... something ...)
      ...
    );
  }
}
现在,Consumer的子代的生成被延迟到builder方法,该方法因此也接收提供者所在的生成上下文。

关于flutter - 使用提供者值 flutter 初始路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63762231/

相关文章:

在 FutureBuilder 中使用 Uint8List 的 Flutter 出现错误

flutter - 如何在 Flutter 中将数据从 showmodalbottomsheet 传递到上一页

php - 与 Ratchet websocket 的 flutter 连接

android - 是否有可能在凸起的按钮中获得 MaterialPageRoute

Dart 扩展 : don't access members with 'this' unless avoiding shadowing

flutter - Provider Widget 的放置位置——Flutter Provider Package

flutter - 在 dart/flutter 中使用 [][] 从包含列表的映射中建立索引时出错

dart - Flutter ListView 渲染问题

使用Provider时出现Flutter 'No Overlay widget exists above EditableText'错误

flutter - 在Flutter中,是否可以使用Provider创建监听函数