#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:
Работает для меня:
- В вашем приложении Flutter создайте экземпляр WordPress с аутентификатором, установленным на JWT
wp.WordPress wordPress = wp.WordPress(
baseUrl: 'https://your-website-domain-only',
authenticator: wp.WordPressAuthenticator.JWT,
adminName: '',
adminKey: '',
);
- На вашем веб-сайте WordPress установите https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api / плагин. Не забудьте интегрировать свой секретный ключ JWT в wp-config.php:
define('JWT_AUTH_SECRET_KEY', 'your-secret-key');
- Вернувшись в ваше приложение 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;
}