无法从``MultiBlocProvider''中分解``提供者''列表

发布于 2025-01-21 21:44:43 字数 1142 浏览 2 评论 0原文

我想从多个来源组合blocproviders中的单个MultiBlocProvider。但是,blocproviders MultiblocProvider构造方法参数的任何尝试都导致运行时错误,提供者< xyz&gt ;找不到。

错误:找不到正确的提供商< foo>在此bloclistener< foo,foostate>小部件

说我有

return MultiBlocProvider(
  providers: [
    BlocProvider(create: (context) => FooCubit()),
    BlocProvider(create: (context) => BarCubit()),
  ],
  child: child,
);

起作用。但是我希望

final concatenatedProviders = [
  BlocProvider(create: (context) => FooCubit()),
] + [
  BlocProvider(create: (context) => BarCubit()),
];
return MultiBlocProvider(
  providers: concatenatedProviders,
  child: child,
);

那不起作用。考虑提供商即使是单个(非关联)列表,也无法工作。

我如何将其分解为提供商,以便仍然可以找到它们?我尝试了为提供者的几种类型注释,例如列表< blocprovider< statestreamablesource< object?>>>>>list> list< blocprovider< blocprovider< blocprovider<等,但是我找不到工作解决方案。

I want to combine BlocProviders from multiple sources into a single MultiBlocProvider. But any attempt to construct a List of BlocProviders outside of the MultiBlocProvider constructor arguments leads to a runtime error, that the Provider<XYZ> could not be found.

Error: Could not find the correct Provider<Foo> above this BlocListener<Foo, FooState> Widget

Say I have

return MultiBlocProvider(
  providers: [
    BlocProvider(create: (context) => FooCubit()),
    BlocProvider(create: (context) => BarCubit()),
  ],
  child: child,
);

That works. But I want

final concatenatedProviders = [
  BlocProvider(create: (context) => FooCubit()),
] + [
  BlocProvider(create: (context) => BarCubit()),
];
return MultiBlocProvider(
  providers: concatenatedProviders,
  child: child,
);

That does not work. Factoring out the providers does not work even if it is a single (non-concatenated) list.

How can I factor out the providers this so that they will still be found? I have tried several type annotations for the providers, such as List<BlocProvider<StateStreamableSource<Object?>>>, List<BlocProvider<dynamic>>, etc, but I couldn't find a working solution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

栖迟 2025-01-28 21:44:43

尝试这个

final providers = <BlocProvider>[
      BlocProvider<FooCubit>(create: (_) => FooCubit()),
    ] +
    <BlocProvider>[
      BlocProvider<BarCubit>(create: (_) => BarCubit()),
    ];

完整的工作示例:

//foo_cubit.dart

import 'package:flutter_bloc/flutter_bloc.dart';

class FooCubit extends Cubit<int> {
  FooCubit() : super(0);

  void add(int x) {
    emit(state + x);
  }

  void substract(int x) {
    emit(state - x);
  }

  void multiply(int x) {
    emit(state * x);
  }

  void divide(int x) {
    emit(state ~/ x);
  }
}


//bar_cubit.dart
import 'package:flutter_bloc/flutter_bloc.dart';

class BarCubit extends Cubit<String> {
  BarCubit() : super("");

  void append(String str) {
    emit(state + str);
  }

  void reverse() {
    emit(String.fromCharCodes(state.codeUnits.reversed));
  }

  void clear() {
    emit('');
  }
}

 //main.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:temp_bloc_runtime/bar_cubit.dart';
import 'package:temp_bloc_runtime/foo_cubit.dart';

void main() {
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    final providers = <BlocProvider>[
          BlocProvider<FooCubit>(create: (_) => FooCubit()),
        ] +
        <BlocProvider>[
          BlocProvider<BarCubit>(create: (_) => BarCubit()),
        ];

    return MultiBlocProvider(
      providers: providers,
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: const MyHomePage(title: 'Flutter Demo Home Page'),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            BlocBuilder<FooCubit, int>(
              builder: (_, state) => Text(
                state.toString(),
              ),
            ),
            BlocBuilder<BarCubit, String>(
              builder: (_, state) => Text(
                state,
              ),
            ),
            const Expanded(child: SizedBox.shrink()),
            Row(
              children: [
                MaterialButton(
                  onPressed: () => context.read<FooCubit>().add(1),
                  child: const Text('+'),
                ),
                MaterialButton(
                  onPressed: () => context.read<FooCubit>().substract(1),
                  child: const Text('-'),
                ),
                MaterialButton(
                  onPressed: () => context.read<BarCubit>().append('A'),
                  child: const Text('+A'),
                )
              ],
            )
          ],
        ),
      ),
    );
  }
}

Try this,

final providers = <BlocProvider>[
      BlocProvider<FooCubit>(create: (_) => FooCubit()),
    ] +
    <BlocProvider>[
      BlocProvider<BarCubit>(create: (_) => BarCubit()),
    ];

Full working example:

//foo_cubit.dart

import 'package:flutter_bloc/flutter_bloc.dart';

class FooCubit extends Cubit<int> {
  FooCubit() : super(0);

  void add(int x) {
    emit(state + x);
  }

  void substract(int x) {
    emit(state - x);
  }

  void multiply(int x) {
    emit(state * x);
  }

  void divide(int x) {
    emit(state ~/ x);
  }
}


//bar_cubit.dart
import 'package:flutter_bloc/flutter_bloc.dart';

class BarCubit extends Cubit<String> {
  BarCubit() : super("");

  void append(String str) {
    emit(state + str);
  }

  void reverse() {
    emit(String.fromCharCodes(state.codeUnits.reversed));
  }

  void clear() {
    emit('');
  }
}

 //main.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:temp_bloc_runtime/bar_cubit.dart';
import 'package:temp_bloc_runtime/foo_cubit.dart';

void main() {
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    final providers = <BlocProvider>[
          BlocProvider<FooCubit>(create: (_) => FooCubit()),
        ] +
        <BlocProvider>[
          BlocProvider<BarCubit>(create: (_) => BarCubit()),
        ];

    return MultiBlocProvider(
      providers: providers,
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: const MyHomePage(title: 'Flutter Demo Home Page'),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            BlocBuilder<FooCubit, int>(
              builder: (_, state) => Text(
                state.toString(),
              ),
            ),
            BlocBuilder<BarCubit, String>(
              builder: (_, state) => Text(
                state,
              ),
            ),
            const Expanded(child: SizedBox.shrink()),
            Row(
              children: [
                MaterialButton(
                  onPressed: () => context.read<FooCubit>().add(1),
                  child: const Text('+'),
                ),
                MaterialButton(
                  onPressed: () => context.read<FooCubit>().substract(1),
                  child: const Text('-'),
                ),
                MaterialButton(
                  onPressed: () => context.read<BarCubit>().append('A'),
                  child: const Text('+A'),
                )
              ],
            )
          ],
        ),
      ),
    );
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文