본문 바로가기

개발하자

Flot의 ChangeNotifier 모델에 비동기식으로 데이터 로드

반응형

Flot의 ChangeNotifier 모델에 비동기식으로 데이터 로드

내 Fluter 애플리케이션에 위젯이 있습니다.

class HomeScreen extends StatelessWidget

모델을 사용하는 경우

class HomeScreenModel extends ChangeNotifier

이 두 개체는 ChangeNotifierProvider를 사용하여 함께 연결됩니다.

응용 프로그램이 홈스크린 위젯을 로드할 때 홈스크린 모델의 사용자 지정 init() 함수를 호출하여 디스크에서 모델로 비동기적으로 일부 데이터를 로드한 다음 수신자에게 알림을 보냅니다.수신기() 기능. 이 작업은 한 번 수행해야 합니다.

이 init() 함수를 호출하는 올바른 위치는 어디입니까? 상태 비저장 위젯의 경우 한 번만 호출되는 라이프사이클 기능이 없는 것으로 알고 있습니다. 하지만 홈 스크린 모델의 생성자는 한 번만 호출됩니다.

자체 생성자에서 비동기 HomeScreenModel.init() 함수를 호출하는 것이 안전합니까? ChangeNotifier로 구현된 모델에 데이터를 비동기적으로 로드하는 방법에 대한 모범 사례가 있습니까?

모두에게 감사드립니다!




약간의 검색과 테스트 후에 나는 HomeScreen Model 생성자에서 async init 함수를 호출하기로 선택한다. 그래서 나는 가지고 있다.

HomeScreenModel(BuildContext context) {
  var initFuture = init(context);
  initFuture.then((voidValue) {
    _log.d('init finished');
    state = HomeScreenModelState.initialized;

    notifyListeners();
  });
}

그리고 init 함수 프로토타입은

Future<void> init(BuildContext context) async

이를 위한 또 다른 방법은 StatefulWidget을 사용하고 비동기 init를 호출하는 것입니다.

initState()

기능. 이 함수는 한 번만 호출되므로 ChangeNotifier 생성자와 같습니다.

현재 나는 StatefulWidgets를 사용하지 않는다. 왜냐하면 그것들이 ui와 비즈니스 로직 사이에 일종의 강력한 결합을 만들어내는 것처럼 보이기 때문이다. 그래서 현재로써는 위의 해결책은 나에게 괜찮은 것 같다.

누군가에게 도움이 되었으면 좋겠다.




이 함수를 호출하는 또 다른 방법은 init() 호출을 제공자의 생성 함수에 넣는 것입니다.

  runApp(ChangeNotifierProvider(
  create: (context) {
    var model = TestModel();
    model.init();
    return model;
  },
  child: TestApp()));

반응형