Элемент экземпляра ‘PageNumber’ не может быть доступен в инициализаторе. Попробуйте заменить ссылку на элемент экземпляра другим выражением

#class #flutter #oop #dart

#класс #flutter #ооп #dart

Вопрос:

Элемент экземпляра ‘PageNumber’ не может быть доступен в инициализаторе. Попробуйте заменить ссылку на элемент экземпляра другим выражением

Как я могу это решить?

Вот как это происходит

Первый класс

 
    class _HomeState extends State<Home> {
      int pageNumber = 1;
    
      Future<String> fetchPosts = FetchPosts(pageNumber).getPosts(); //<== The error happens here(PageNumber)
      List<wp.Post> posts = FetchPosts(pageNumber).posts;  //<== The error happens here (PageNumber)
      @override
      Widget build(BuildContext context) {
        return ListView.builder(
          itemCount: posts == null ? 0 : posts.length,
          itemBuilder: (BuildContext context, int index) {
            return buildPost(context, posts, index); //Building the posts list view
          },
        );
      }
    }


  

Второй класс

 
    import 'package:flutter_wordpress/flutter_wordpress.dart' as wp;
    import 'package:saviortv/models/fetchWordPressPosts.dart';
    
    class FetchPosts {
      FetchPosts(this.pageNumber);
      final int pageNumber;
    
      List<wp.Post> posts = [];
    
      Future<String> getPosts() async {
        var res = await fetchPosts(pageNumber);
        print(pageNumber);
        posts = res;
        return "Success!";
      }
    }

  

Как я могу это решить?

Ответ №1:

В этом сценарии вам нужно использовать FutureBuilder, как getPosts() и метод asyc.

Переработанный код:

 class FetchPosts {
  FetchPosts(this.pageNumber);
  final int pageNumber;

  Future<wp.Post> getPosts() async {
    List<wp.Post> posts = [];
    posts = await fetchPosts(pageNumber);
    print(pageNumber);
    return posts;
  }
}
  
 FutureBuilder(
   future: FetchPosts(pageNumber).getPosts(),
       builder: (context, snapshot) {
         if(snapshot.hasData){
           List<wp.Post> posts=snapshot.data;
           return ListView.builder(
             itemCount: posts == null ? 0 : posts.length,
             itemBuilder: (BuildContext context, int index) {
               return buildPost(context, posts, index); //Building the posts list view
             },
           );
        }
         return Text('Error..');
       }
     )
  

Ответ №2:

Вам нужно изменить это.

 class _HomeState extends State<Home> {
      int pageNumber = 1;
      Future<String> fetchPosts;
      List<wp.Post> posts;

      @override
      void initState() {
        fetchPosts = FetchPosts(pageNumber).getPosts();
        posts = FetchPosts(pageNumber).posts;
        super.initState();
      }

      @override
      Widget build(BuildContext context) {
        return ListView.builder(
          itemCount: posts == null ? 0 : posts.length,
          itemBuilder: (BuildContext context, int index) {
            return buildPost(context, posts, index); //Building the posts list view
          },
        );
      }
}
  

Комментарии:

1. Я хочу, чтобы он был в другом файле man… Можете ли вы дать мне лучшее решение?

2. Я не понимаю, что вы имеете в виду, когда хотите, чтобы он был в другом файле. Можете ли вы это объяснить?

3. Я разделил классы на два файла (вы можете видеть в моем вопросе) Я разделил их, чтобы я мог использовать другой класс и в других файлах