私はフラッターを学んでおり、cubit を使用して todo リスト アプリケーションに取り組むことにしました。ホーム画面でブロックプロバイダーを使用してキュービットを作成し、別の画面で別のキュービットを作成せずに同じキュービットを直接消費しようとしています。
ホームスクリーン 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(
2 番目のページに移動するボタンがあります。
Widget buildTaskCat(tasknum, cat, progress, context) {
return InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => cattaskview(
cat: cat,
progress: progress,
tasknum: tasknum,
),
),
);
},
2 番目のページでは、ブロック プロバイダーを使用せずに cubit を消費しようとしています。ブロックプロバイダーを使用すると、データベース内のデータにアクセスできなくなり、データベースの作成を再度呼び出す必要があります。
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;
}