【问题标题】:BlocProvider not available within inherited widgetBlocProvider 在继承的小部件中不可用
【发布时间】:2019-03-14 22:22:37
【问题描述】:

面临 BlocProviders 的问题。

据我所知,一个块应该可以在继承的小部件范围内的任何地方访问。

我有一个 App 类,它恰好是我的核心类,我在其中构建我的材料 App

 Widget build(BuildContext context) {
  return MaterialApp(
    debugShowCheckedModeBanner: false,
    title: 'E-Form',
    color: Color(0xFF44697D),
    home: BlocProvider(child: LaunchScreen()),
  );
}

现在我有了 LaunchScreen 类,这里我没有使用我的 BlocProvider,但我已经用 BlocProvider 将 LaunchScreen 完全包装在我的 App 类中

class  LaunchScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final bloc = BlocProvider.of(context);
    return Scaffold(
      appBar: AppBar(
        title: Text('First Screen'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Launch screen'),
          onPressed: () {
            // Navigate to second screen when tapped!
            Navigator.of(context).push(
              MaterialPageRoute(builder: (context) => Home()),
            );
          },
        ),
      ),
    );
  }
}

现在又是我的第三堂课,即 Home() 课。我正在尝试使用我的 BlocProvider。在这里我收到一个错误,说该集团为空

class Home extends StatelessWidget {
  Widget build(context) {
    final bloc = BlocProvider.of(context);
    return  Scaffold(
      appBar: AppBar(
        title: Text('Reduced Course Load'),
        backgroundColor: Color(0xFF44697D),
      ),
      body: CustomWidget(),
    );
  }
}

我无法弄清楚为什么这是空的。如果我在 LaunchScreen 类中初始化并打印 bloc,则该 bloc 被完美初始化。 BlocProvider 是否仅在单个类范围内工作?

还有一个错误,我认为我的导航器工作不正常。出于某种原因,我的 Home() 类构造函数再次被召回。我无法修复 Navigator 中的错误。一个例子对我理解导航器很有帮助。

这是我的颤振医生结果

$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel beta, v0.8.2, on Mac OS X 10.13.6 17G65, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK 28.0.0)
[✓] iOS toolchain - develop for iOS devices (Xcode 9.4.1)
[✓] Android Studio (version 3.2)
[✓] VS Code (version 1.27.2)
[✓] Connected devices (1 available)

请看一下,并分享解决方案。谢谢!

【问题讨论】:

  • 给出完整的代码,给出的代码不清楚你在 BlocProvider 和 BlocStepperProvider 中有什么逻辑。
  • 查看有关 InheritedWidget 的文档:docs.flutter.io/flutter/widgets/InheritedWidget-class.html ,仅当您想沿树传播信息时。
  • @sreeramu,它只是 BlocProvider,我忘了用 BlocProvider 重构名称 BlocStepperProvider。很抱歉造成混乱
  • @diegoveloper,我知道信息将被向下传播,我已经浏览了文档。我的问题是,当我在树上传播信息时,为什么我的集团无法访问。

标签: flutter flutter-layout flutter-dependencies flutter-sliver


【解决方案1】:

您应该在MaterialApp 小部件上方使用BlocProvider()

NavigatorMaterialApp 添加的小部件,当您调用它来更改路由时,它会替换home: 属性中的小部件,从而替换您的BlocProvider

 Widget build(BuildContext context) {
  return BlocProvider(
    child: MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'E-Form',
      color: Color(0xFF44697D),
      home: LaunchScreen(),
    ),
  );
 }

【讨论】:

  • 嗨@chemamolins,我仍然不确定为什么导航器会替换整个主页小部件。为什么需要这样做?
  • 嗯,是的,你是对的。如果您执行push() 而不是pushReplacement(),它不会被替换,只是添加到路由堆栈中,但无论如何,新路由/页面与home: 平行。您的BlocProvider()home: 路由的根,因此您无法从其他路由中找到它。在您的设置中,查看 Widget Inspector 树。您将看到您的 BlocProvider 和您的 Home() 位于不同的分支中。您是否尝试将BlocProvider() 放在MaterialApp 上方?
【解决方案2】:

您也可以将您的块传递给屏幕“主页”,然后将您的脚手架包装在 BlocProvider.value(yourBlocInstance) 中。顺便说一句,这可以让您将 BlocProvider(create: (context) => YourBloc()) 放在 MaterialApp 下,并且导航不会破坏它。

【讨论】:

    猜你喜欢
    • 2021-05-24
    • 1970-01-01
    • 2022-07-19
    • 2018-10-02
    • 2019-10-24
    • 2020-05-14
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    相关资源
    最近更新 更多