Flutter WordPress: получатель ‘length’ был вызван при null . Получатель: null Попытался вызвать: length

#wordpress #flutter

#wordpress #flutter

Вопрос:

У меня небольшая проблема в моем коде Flutter. Я пытаюсь отобразить сообщения на своем веб-сайте в приложении, используя пакет flutter «flutter_wordpress». Если я сейчас использую «https://demo.wp-api.org «как на веб-сайте, как в примере кода, сообщения отображаются нормально. Но если я использую свой собственный адрес веб-сайта WordPress с сообщениями, The getter 'length' was called on null. Receiver: null Tried calling: length появляется ошибка

 import 'details_page.dart';

class LandingPage extends StatelessWidget {

 wp.WordPress wordPress = wp.WordPress(
 baseUrl: 'https://pluto.faithlux.eu/wp-json/wp/v2/posts',
);

  _launchUrl(String link) async {
    if (await canLaunch(link)) {
      await launch(link);
    } else {
      throw 'Cannot launch $link';
    }
  }


  _fetchPosts() {
    Future<List<wp.Post>> posts = wordPress.fetchPosts(
        postParams: wp.ParamsPostList(
          context: wp.WordPressContext.view,
          pageNum: 1,
          perPage: 5,
        ),
        fetchAuthor: true,
        fetchFeaturedMedia: true,
        fetchComments: true
    );

    return posts;
  }

  _getPostImage(wp.Post post) {
    if (post.featuredMedia == null) {
      return SizedBox();
    }
    return Image.network(post.featuredMedia.sourceUrl);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: FutureBuilder(
          future: _fetchPosts(),
          builder: (BuildContext context, AsyncSnapshot<List<wp.Post>> snapshot) {
            if (snapshot.connectionState == ConnectionState.none) {
              return Container();
            }
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(
                child: CircularProgressIndicator(),
              );
            }
            return ListView.builder(
              itemCount: snapshot.data.length ?? 0,
              itemBuilder: (context, index) {
                wp.Post post = snapshot.data[index];
                return InkWell(
                  onTap: () {
                    Navigator.push(
                        context,
                        MaterialPageRoute(
                            builder: (context) => DetailsPage(post)
                        )
                    );
                  },
                  child: Padding(
                    padding: const EdgeInsets.all(5.0),
                    child: Card(
                      child: Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Column(
                          children: <Widget>[
                            _getPostImage(post),
                            SizedBox(height: 10,),
                            Text(
                              post.title.rendered.toString(),
                              style: TextStyle(
                                  fontWeight: FontWeight.bold,
                                  fontSize: 20
                              ),
                            ),
                            SizedBox(height: 15,),
                            Html(
                              data: post.excerpt.rendered.toString(),
                              onLinkTap: (String link) {
                                _launchUrl(link);
                              },
                            ),
                            Row(
                              mainAxisAlignment: MainAxisAlignment.spaceBetween,
                              children: <Widget>[
                                Text(post.date.toString().replaceAll('T', ' ')),
                                Text(post.author.name),
                              ],
                            )
                          ],
                        ),
                      ),
                    ),
                  ),
                );
              },
            );
          },
        ),
      ),
    );
  }}
 

Ответ №1:

Работает ли ваш REST API для сообщений на вашем сайте так, как ожидалось?


Похоже, это проблема с вашим сайтом, а не с приложением .. что возвращает этот URL-адрес? :


  https://"yoursite".com/wp-json/wp/v2/posts
 

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

1. Привет 🙂 спасибо за быстрый ответ! На странице действительно отображается ошибка. Но я только сейчас это заметил, потому что вчера ссылка работала недолго. Ошибка показывает: {"status":"error","error":"MISSING_AUTHORIZATION_HEADER","code":"401","error_description":"Authorization header not received. Either authorization header was not sent or it was removed by your server due to security reasons."} . Вы знаете , как это исправить ?

2. о, и я вижу, я разместил неправильный код в своем вопросе выше. Я изменю его.

Ответ №2:

Работает для меня:

  1. В вашем приложении Flutter создайте экземпляр WordPress с аутентификатором, установленным на JWT
     wp.WordPress wordPress = wp.WordPress(
        baseUrl: 'https://your-website-domain-only',
        authenticator: wp.WordPressAuthenticator.JWT,
        adminName: '',
        adminKey: '',
      );
 
  1. На вашем веб-сайте WordPress установите https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api / плагин. Не забудьте интегрировать свой секретный ключ JWT в wp-config.php:
 define('JWT_AUTH_SECRET_KEY', 'your-secret-key');
 
  1. Вернувшись в ваше приложение Flutter, вам необходимо пройти аутентификацию с использованием учетных данных администратора, прежде чем отправлять подобные сообщения:
     Future<List<wp.Post>> _fetchPosts() async {
      Future<wp.User> response = wordPress.authenticateUser(
        username: 'your admin username',
        password: 'your admin password',
      );

      try {
        wp.User user = await response;
        print("User is: ");
        print(user);
      } catch (e) {
        print('Failed to fetch user: $e');
      }

      List<wp.Post> posts = await wordPress.fetchPosts(
        postParams: wp.ParamsPostList(
          context: wp.WordPressContext.view,
          pageNum: 1,
          perPage: 10,        
        ),
        fetchAuthor: true,
        fetchFeaturedMedia: true,
        fetchCategories: true
      );

      return posts;
    }