【问题标题】:Flutter - Cant find bloc in the parent tree when using showDialogFlutter - 使用 showDialog 时无法在父树中找到 bloc
【发布时间】:2021-07-29 15:46:20
【问题描述】:

我在一个小应用程序中使用了 Flutter 和 flutter_bloc,我使用 MultiBlocProvider 在主页中使用了我需要的多个 BlocProvider,在主页下,有一个 MainWidget,它可以通过以下方式轻松访问给定的 Bloc: BlocProvider.of<OldBloc>(context) MainWidget 通过以下方式调用 NewWidget 作为对话框:showDialog(context: context, builder: (context) => NewWidget()) 问题是,我无法从 NewWidget() 访问 OldBloc,所以我假设 MainWidget 在使用 showDialog 时没有将其上下文传递给 NewWidget?

HomeScreen.dart

import 'package:flutter/material.dart';

class HomeScreen extends StatelessWidget {
  const HomeScreen({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: MultiBlocProvider(
      providers: [
        BlocProvider(
          create: (context) => OldBloc()..add(Initialize()),
        ),
        BlocProvider(
          create: (context) => OtherBloc()..add(Initialize()),
        ),
      ],
      child: Stack(
        children: [
          MainWidget(),
          MenuWidget(),
        ],
      ),
    ));
  }
}

MainWidget.dart

import 'package:flutter/material.dart';

class MainWidget extends StatelessWidget {
  const MainWidget({
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return TextField(onTap: () => showDialog(context: context, builder: (context) => NewWidget()));
  }
}

NewWidget.dart

import 'package:flutter/material.dart';

class NewWidget extends StatelessWidget {
  const NewWidget({Key key}) : super(key: key);

  @override
  Widget build(context) {
    return Text(BlocProvider.of<OldBloc>(context).name); // <------- THIS GIVES AN ERROR THAT IT CANT FIND A BLOC OF THE TYPE OldBloc
  }
}

【问题讨论】:

    标签: flutter flutter-bloc


    【解决方案1】:

    您在showDialog 方法、文档中无权访问BuildContext

    构建器返回的小部件不与最初调用 showDialog 的位置共享上下文。

    上下文参数用于查找对话框的导航器和主题。仅在调用方法时使用。

    还建议使用StatefulBuilder 或自定义StatefulWidget,这里是example

    【讨论】:

    • 将集团作为参数传递是一个好的解决方案吗?
    • 我个人会尝试将 BuildContext 作为最终参数显式传递并在您的 bloc 调用中使用它,或者(如果在任何情况下都可以)尝试在您的 MaterialApp 之前提供 bloc是一个全局范围,不确定这是否仍然适用于 showDialog 上下文,但无论如何值得一试。
    • 我只是尝试传递 BuildContext 并尝试传递 BlocProvider 并且它们都工作了,但是我通过传递 BuildContext 解决了,我发现它比使用全局范围的 bloc 更好,谢谢你的帮助 :)
    猜你喜欢
    • 2021-10-26
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2021-08-26
    • 1970-01-01
    • 2021-01-06
    • 2022-07-17
    相关资源
    最近更新 更多