flutter - 如何在 Flutter 中使用 Provider 正确获取 API

标签 flutter setstate flutter-provider

我目前正在处理一个问题,我需要来自 API 的一些数据才能将其显示到我的小部件中。我遵循了一些 Provider 架构模式,在那里你 setState 两次:

1- 获取数据时

2- 当数据已经被获取时

所以我目前正在处理的问题是,我的小部件抛出以下错误:
setState() or markNeedsBuild() called during build.
我知道这个错误是因为在构建过程中调用了 setState,但是..如何在构建过程中获取我的 api,然后将它显示给我的小部件?这是我的代码:

NewsPage.dart

    class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  SideBarWidget _sidebar;

  @override
  void initState() {
    Provider.of<HomeViewModel>(context, listen: false)
        .fetchUltimaNoticia(context); --> ****Data to get fetched****
    _sidebar = const SideBarWidget();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('INICIO'),
        centerTitle: true,
        automaticallyImplyLeading: false,
        leading: Builder(
          builder: (context) => IconButton(
            icon: const Icon(Icons.menu),
            onPressed: () => Scaffold.of(context).openDrawer(),
          ),
        ),
      ),
      drawer: _sidebar,
      body: FormNoticiaContainer(),
    );
  }
}

FormContainer()
Widget build(BuildContext context) {
    return _crearBodyNoticia(context);
  }

  Widget _crearBodyNoticia(context) {
    final homeVm = Provider.of<HomeViewModel>(context, listen: true);
    return homeVm.state == ViewState.Busy
        ? Center(child: CircularLoading())
        : Center(
            child: DataToShowWidget()

HomeViewModel.dart
    class HomeViewModel extends BaseModel {
  ////////
  //NOTICIAS
  ////////

  NoticiaDB _noticia;

  NoticiaDB get noticia => _noticia;

  set setNoticia(NoticiaDB noticia) {
    _noticia = noticia;
  }

  Future fetchUltimaNoticia(BuildContext context) async {
    setState(ViewState.Busy);

    var response = await noticiaProvider.obtenerNoticiaPublicada();

    setNoticia = response;

    setState(ViewState.Idle);
  }
}

基础模型
 ViewState _state = ViewState.Idle;

  ViewState get state => _state;

  void setState(ViewState viewState) {
    _state = viewState;
    notifyListeners();
  }

最佳答案

您可以使用 WidgetsBinding.instance.addPostFrameCallback详情可引用https://www.didierboelens.com/faq/week2/

代码片段

@override
void initState(){
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_){
    Provider.of<HomeViewModel>(context, listen: false)
    .fetchUltimaNoticia(context);  

  });
}

关于flutter - 如何在 Flutter 中使用 Provider 正确获取 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60160972/

相关文章:

android - 在 Flutter 中将行和列与溢出的长文本对齐

dart - 为什么在这种情况下使用工厂构造函数

flutter - 如何在 flutter 右侧的 RadioButtonList Tile 中设置单选按钮

native - 如何使用 MethodChannel 从 native 平台调用应用程序的 Dart 部分中的方法?

javascript - 为什么 React 中的 SetState 会更新处理程序中的其他对象?

javascript - componentDidMount 中的多个 setState

javascript - React 是否保持状态更新的顺序?

当 sqflite 数据库数据更改时,Flutter 提供程序监听器不会自行更新

Flutter - 在 Provider 值更改时触发 PageView 更改

flutter - 在此小部件上方找不到正确的提供者