【问题标题】:when I am calling the provider in the inistate return data got null当我在 inistate 中调用提供程序时,返回数据为 null
【发布时间】:2021-09-20 07:09:30
【问题描述】:

我的问题是......当应用程序启动(初始启动)循环进度指示器出现并且没有任何数据......我的应用程序有 3 个选项卡(使用选项卡栏),但是当我在我的选项卡之间切换,当我来到 Home 选项卡时,我得到了数据和根据数据呈现的 ui ......

我想在应用开始获取数据并需要渲染数据时......

用户界面创建

  class Home extends StatefulWidget {
  const Home({ Key? key }) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
int _page = 1;

void initState() {  
        var postProvider = Provider.of<PostProvider>(context, listen: false);
        postProvider.initStreamsPost();
        postProvider.fetchAllData(_page);
        }

  @override
  Widget build(BuildContext context) {
    return Consumer<PostProvider>(builder: (context, postsModel, child) {
    print("builder length... ${postsModel.allData!.length}"); //when the first time app opens what I got print in terminal  =>  builder length... 0

          if (postsModel.allData != null && postsModel.allData!.length > 0) {
            return ListView.builder(
                physics: const AlwaysScrollableScrollPhysics(),
                itemCount: postsModel.allData?.length,
                itemBuilder: (BuildContext context, int index) {
                  return PostCard(
                  );
                });
          }

          
          return Center(child: CircularProgressIndicator());
        }
  }
}

changeNotifier 类

    class PostProvider extends ChangeNotifier {
    
    int totalPages = 0;
    int? get totalRecords => _postsFetcher!.totalPosts;
    PostApi? _postApi;
  PostsModel? _postsFetcher;

    
    List<Post>? get allData =>
          _postsFetcher?.posts != null ? _postsFetcher?.posts : [];
    
    PostProvider() {
        initStreamsPost();
      }
    
      initStreamsPost() async {
        _postApi = await new PostApi();
        _postsFetcher = await new PostsModel();
      }
    
    fetchAllData(pageNumber) async {
    
        if ((totalPages == 0) || pageNumber <= totalPages) {
          PostsModel itemModel = await _postApi!.getPost2(pageNumber);
          print("have data");
    
          if (_postsFetcher!.posts == null) {
            totalPages = ((itemModel.totalPosts! - 1) / 4).ceil();
            _postsFetcher = itemModel;
            notifyListeners();
    
          } else {
            _postsFetcher?.posts?.addAll(itemModel.posts!);
            _postsFetcher = _postsFetcher;
        notifyListeners();
          }
        }
    
      }
    
    }

【问题讨论】:

    标签: flutter dart flutter-dependencies flutter-provider flutter-change-notifier


    【解决方案1】:

    initState 中使用Provider 时,更喜欢这样使用:

    void initState() {
      WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
        var postProvider = Provider.of<PostProvider>(context, listen: false);
        postProvider.initStreamsPost();
        postProvider.fetchAllData(_page);
      });
    }
    

    【讨论】:

    • 我试试这个...仍然出现错误(错误)
    猜你喜欢
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多