超初心者が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