Reputation: 19
It seems initstate not working on screen render I am not sure why. I also ran print statement under initState and it prints nothing. It always grabs the empty variable of left/rightNewsinfo or left/rightTitle because it gives "Invalid argument(s): No host specified in URI file:///
" error everytime I run it. I installed SimpleLinkPreview
function from pub.dev and it gives correct print statement. I think error is coming from my code. I am new on flutter. Null safety is enabled
import 'package:flutter/material.dart';
import 'package:news_upload/widgets/news_box.dart';
import 'package:simple_link_preview/simple_link_preview.dart';
class ActualNews extends StatefulWidget {
static const routeName = '/actualNews';
static List<dynamic> leftNewsInfo = [];
static List<dynamic> rightNewsInfo = [];
@override
State<ActualNews> createState() => _ActualNewsState();
}
class _ActualNewsState extends State<ActualNews> {
final leftNewsLink =
"https://www.ndtv.com/india-news/goa-congress-requests-speaker-to-disqualify-mlas-michael-lobo-digambar-kamat-after-accusing-them-of-planning-defections-3146905";
var rightNewsLink =
"https://zeenews.india.com/india/kaali-poster-row-tmc-mp-insults-maa-kali-but-mamata-banerjee-smriti-irani-lashes-out-at-mahua-moitra-2484047.html";
String leftTitle = '';
String leftImage = '';
String rightTitle = '';
String rightImage = '';
Future<void> getNews(lInfo, rInfo) async {
var L = await SimpleLinkPreview.getPreview(leftNewsLink);
var R = await SimpleLinkPreview.getPreview(rightNewsLink);
leftTitle = L!.title!;
leftImage = L.image!;
rightTitle = R!.title!;
rightImage = R.image!;
lInfo = [leftTitle, leftImage];
rInfo = [rightTitle, rightImage];
}
@override
void initState() {
super.initState();
Future.delayed(const Duration(seconds: 0), () {
getNews(ActualNews.leftNewsInfo, ActualNews.rightNewsInfo);
print(ActualNews.leftNewsInfo[0]);
print("hello world");
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
alignment: Alignment.topLeft,
children: <Widget>[
NewsBox(ActualNews.leftNewsInfo, ActualNews.rightNewsInfo),
IconButton(
icon: const Padding(
padding: EdgeInsets.all(20.0),
child: Icon(Icons.arrow_back),
),
onPressed: () {
Navigator.pop(context);
},
),
],
));
}
}
Upvotes: 1
Views: 273
Reputation: 10349
You should use setState
to change the internal state of _ActualNewsState
. Actually, the internal state should be changed only by setState
.
I'd also fix both statics leftNewsInfo
and rightNewsInfo
by moving them to a non-static in the _ActualNewsState
class and remove the parameters of getNews
. This is prone to error as static class vars are shared between multiple instances of ActualNews
widget.
To fix it just do the following:
Future<void> getNews() async {
var L = await SimpleLinkPreview.getPreview(leftNewsLink);
var R = await SimpleLinkPreview.getPreview(rightNewsLink);
setState(() {
leftTitle = L!.title!;
leftImage = L.image!;
rightTitle = R!.title!;
rightImage = R.image!;
leftNewsInfo = [leftTitle, leftImage];
rightNewsInfo = [rightTitle, leftImage];
});
}
Upvotes: 1