将构造函数初始化值传递给另一个方法

问题描述 投票:0回答:1

我想在flutter中使用本地数据库“isar”以及cubit状态管理。在以下代码中:

  1. 变量“isarIn”在main()方法中初始化
  2. 然后传递给MainApp类
  3. 然后在创建存储库对象“localIsarRepository”时再次转发

我收到一条错误消息“实例成员‘_isarIn’无法在初始化程序中访问。尝试用不同的表达式替换对实例成员的引用”当然我检查了提供的解决方案,但它们不适合。

有人可以帮忙吗?

void main() async {

  final dir = await getApplicationDocumentsDirectory();


  final isarOut = await Isar.open(
    [CostSchema],
    directory: dir.path,
  );

  runApp(MainApp(isarIn: isarOut));
}

class MainApp extends StatelessWidget {
  MainApp({super.key, required this.isarIn});
  final Isar isarIn;


  final localIsarRepository = LocalIsarRepository(isarIn);

  @override
  Widget build(BuildContext context) {
      return BlocProvider(

flutter initializer flutter-hive flutter-cubit flutter-isar
1个回答
0
投票

这是因为您试图用

localIsarRepository
和声明字段直接初始化
isarIn
,这是不行的。 但是你必须通过
localIsarRepository
的构造函数来初始化
MainApp
。顺便说一下,如果 MainApp 也是 stateFullWidget,你也可以使用 initState 来完成。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final dir = await getApplicationDocumentsDirectory();

  final isarOut = await Isar.open(
    [CostSchema],
    directory: dir.path,
  );

  runApp(MainApp(isarIn: isarOut));
}

class MainApp extends StatelessWidget {
  final Isar isarIn;
  final LocalIsarRepository localIsarRepository;

  MainApp({Key? key, required this.isarIn})
      : localIsarRepository = LocalIsarRepository(isarIn), // this is where I explained in above
        super(key: key);

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => YourCubit(localIsarRepository),
      child: MaterialApp(
        home: YourHomePage(),
      ),
    );
  }
}

class LocalIsarRepository {
  final Isar isar;

  LocalIsarRepository(this.isar);
}

class YourCubit extends Cubit<YourState> {
  final LocalIsarRepository repository;

  YourCubit(this.repository) : super(YourInitialState());

  // Put your logics of your cubit 
}

class YourHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text('Test!!!!'),
      ),
    );
  }
}

关于代码:

main 首先初始化

Isar
,然后传递给
MainApp
,然后构造函数初始化
localIsarRepository
。这意味着它正确地获得了
isarIn
。并且您的 BlocProvider 使用该存储库设置 Cubit。通过这些代码,您不会直接在字段初始值设定项中访问实例成员。

如果您有任何疑问,请随时询问。

快乐编码...

© www.soinside.com 2019 - 2024. All rights reserved.