抛出 providernotfoundexception(t, context.widget.runtimetype);
Posted
技术标签:
【中文标题】抛出 providernotfoundexception(t, context.widget.runtimetype);【英文标题】:throw providernotfoundexception(t, context.widget.runtimetype); 【发布时间】:2021-11-27 23:57:26 【问题描述】:我正在学习 Flutter,并决定使用 cubit 开发一个待办事项列表应用程序。我在主屏幕中使用 bloc 提供程序创建了一个肘,在另一个屏幕中我试图直接使用相同的肘而不创建另一个。
主屏幕 cubit 部分和使用 cubit 创建数据库:
我在这里创建了cubit并创建了数据库。
class Homescreen extends StatelessWidget
const Homescreen(Key? key) : super(key: key);
@override
Widget build(BuildContext context)
return BlocProvider(
create: (context) => appcubit()..CreateDatabase(),
child: BlocConsumer<appcubit, appStates>(
listener: (context, state)
// ignore: todo
// TODO: implement listener
,
builder: (context, state)
appcubit cubit = appcubit.get(context);
return Scaffold(
我有一个指向第二页的按钮:
Widget buildTaskCat(tasknum, cat, progress, context)
return InkWell(
onTap: ()
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => cattaskview(
cat: cat,
progress: progress,
tasknum: tasknum,
),
),
);
,
在第二页上,我尝试在不使用 bloc 提供程序的情况下消耗肘位。当我以某种方式使用 bloc 提供程序时,我无法访问数据库中的数据,我必须再次调用 create database。
class cattaskview extends StatelessWidget
const cattaskview(
Key? key,
required this.cat,
required this.tasknum,
required this.progress)
: super(key: key);
final String cat;
final int tasknum;
final double progress;
@override
Widget build(BuildContext context)
return BlocConsumer<appcubit, appStates>(
listener: (context, state)
// TODO: implement listener
,
builder: (context, state)
return Scaffold(
我在尝试运行时收到此错误消息
if (inheritedElement == null && null is! T)
throw ProviderNotFoundException(T, context.widget.runtimeType);
return inheritedElement;
【问题讨论】:
【参考方案1】:您是否尝试过使用BlocProvider.value()
小部件?
例如:
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => BlocProvider.value(
value: BlocProvider.of<appcubit>(context)
child: cattaskview(),
)
)
);
【讨论】:
执行此操作时仍然出现错误:BlocProvider.of() called with a context that does not contain a appcubit.
【参考方案2】:
我通过在材料应用程序之前创建肘部解决了这个问题
void main()
Bloc.observer = MyBlocObserver();
runApp(const Todo());
class Todo extends StatelessWidget
const Todo(Key? key) : super(key: key);
@override
Widget build(BuildContext context)
return BlocProvider(
create: (context) => appcubit()..CreateDatabase(),
child: BlocConsumer<appcubit, appStates>(listener: (context, state)
// TODO: implement listener
, builder: (context, state)
return MaterialApp(
theme: ThemeData(
appBarTheme: const AppBarTheme(
systemOverlayStyle: SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
statusBarIconBrightness: Brightness.light,
),
),
),
home: Homescreen(),
debugShowCheckedModeBanner: false);
));
【讨论】:
以上是关于抛出 providernotfoundexception(t, context.widget.runtimetype);的主要内容,如果未能解决你的问题,请参考以下文章
Android 上的 Google Ads API 客户端引发 ProviderNotFoundException
如何在小部件测试中测试特定的 ProviderNotFoundException
ProviderNotFoundException(错误:在此主页小部件上方找不到正确的 Provider<EntryProvider>
SpringSecurity 提示ProviderNotFoundException: No AuthenticationProvider found for ****