youshin2020
@youshin2020

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

超初心者がflutterのLocatorMixinで実装の中で壁にぶち当たった

解決したいこと

flutterで自前のapiと接続してその値を表示するアプリをつくっています。
記事を投稿する機能の実装中にエラーが発生しました。
flutterでのアプリ作成経験は皆無の超初心者です。
今回記事などを参考にしながら実装を進めているため、原因の特定が難航しております。
原因がわかる方がいらっしゃいましたら、ご教授いただきたいです。

発生している問題・エラー

Unhandled Exception: NoSuchMethodError: The method 'load' was called on null.

final data = await _service.load();
            ↑の_serviceがnullになる。

該当するソースコード

import 'package:state_notifier/state_notifier.dart';
import 'package:coach_student_app/src/app/service/main_service.dart';

import '../state/main/main_state.dart';

class MainController extends StateNotifier<MainState> with LocatorMixin {
  MainService get _service => read();
  MainController() : super(const MainState.data());

  @override
  void initState() {
    super.initState();
    load();
  }

  bool get isLoading => state.isLoading || !state.isLoading;

  Future<void> load() async {
    try {
      final data = await _service.load();
      state = state.copyWith(
        homeData: data['homeData'],
      );
    } on Exception {
      state = state.copyWith(
        homeData: [],
      );
    }
  }
}

呼び出し先のソースコード

import 'package:meta/meta.dart';

import '../entity/home/home_entity.dart';
import '../service/home/home_repository_interface.dart';

class MainService {
  const MainService({@required this.homeRepository});

  final HomeRepositoryInterface homeRepository;

  Future<Map<String, List<HomeEntity>>> load() async {
    return homeRepository.findByHomePage();
  }
}

自分で試したこと

https://qiita.com/nukotsuka/items/f91dc5aca319b0da4dc2
の記事を参考に、実装してみたのですが、初心者すぎて何をどうすれば良いのかいまいち特定できておらず、、

1月28日追記

      case main:
        return MaterialPageRoute<void>(
          settings: const RouteSettings(name: main),
          builder: (context) => MultiProvider(
            providers: [
              Provider(
                create: (context) {
                  return MainService(
                    homeRepository: HomeRepository(
                      api: context.read(),
                    ),
                  );
                },
              ),
              StateNotifierProvider<MainController, MainState>(
                create: (context) {
                  return MainController();
                },
              ),
            ],
            child: const MainPage(),
          ),
        );

処理を追って自分で確認したところ、このcontrollerを呼び出すときに、一緒に作成していたproviderにおいて、MainServiceのインスタンス化がうまく出来てないことが原因でした。
MainServiceのインスタンスを作成できるように修正したところ、うまくいきました。

0

No Answers yet.

Your answer might help someone💌