1

My question is.......When the app Started(initial start) circular progress indicator appears & didn't got any data.....My app has 3 tabs(using tabbar), but when I swicth between my tabs & when I came to the Home tab now I got the data & ui render according to the data....

I want when the app start get data & needs render the data....

Ui inistate

  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

    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();
          }
        }
    
      }
    
    }
Lang Minh Nguyên
  • 3,648
  • 4
  • 10
  • 31

1 Answers1

1

While using Provider in initState, prefer using it this way:

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