如何 运行 异步等待来自 initState 中提供程序存储的代码

How to run async await code which is from store of provider inside initState

我正在尝试在我的应用程序启动时从 API 获取数据。因此,我在Provider的一个store写了async await函数,用来带API个数据。但是,它不起作用并发送 404 状态代码。我该如何解决这个问题?

main.dart 代码

@override
  void initState(){
    super.initState();
    // this is the code from provider
    context.read<HomeData>().getData();
  }

  @override
  Widget build(BuildContext context) {
    return  DefaultTabController(
      length: 4,
      child: Scaffold(
        appBar: TopAppBar(
        ),
        body: BodyPage(
          changePage : _changePage,
          pageController : _pageController,
          currentIndex : _currentIndex,
        ),
        bottomNavigationBar: BottomBar(currentIndex: _currentIndex, pageController: _pageController),
        extendBodyBehindAppBar: true,
      ),
    );
  }

提供商商店代码

class HomeData extends ChangeNotifier {
  var homeData = [];
  var boardItem = {};

  late String _image;
  String get image => _image;
  late String _content;
  String get content => _content;
  var _now;
  DateTime get now => _now;

  // 처음 홈에서 렌더링 될 때 나오는 아이템 데이터를 불러옴
  getData() async{
    var rawData = await http.get(Uri.parse('https://codingapple1.github.io/app/Constants.json'));
    if (rawData.statusCode == 200) {
      homeData = jsonDecode(rawData.body);
      print(homeData);
    }
    else{
      print('statusCode : ${rawData.statusCode}');
    }

    notifyListeners();
  }
}

As the issue is 404 means page is not found(available). Try rechecking the link path.

在构建第一帧之前,您会发现 context 问题。您可以使用 addPostFrameCallback.

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
      await context.read<HomeData>().getData();
    });
  }

您也可以尝试使用 FutureBuilder

您可以使用 FutureBuilder 或 WidgetsBinding,也可以将其置于初始状态; Future.delayed(Duration.zero, ()async{await xx();},);