Deepanshu Kashyap
Deepanshu Kashyap

Reputation: 19

initState function not running on screen rendering - flutter

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

Answers (1)

lepsch
lepsch

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

Related Questions