flutterurlflutter-inappwebviewflutter-sharedpreference

Inappwebview and Shared Preference URL I can't assign the url stored in Shared Preference


good evening. I'm trying to assign a Shared Preference url but the page doesn't load, it only works when I assign the value to a variable like this:

String url = 'https://www.youtube.com/';

I have tried in many ways and I still have not been able to find out where I have the error, I am new to the world of flutter I hope you can help me.


This is the code...

import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Webpage extends StatefulWidget {
  const Webpage({super.key});
  @override
  State<Webpage> createState() => _WebpageState();
}

class _WebpageState extends State<Webpage> {
  String initialUrl = '';

  
  @override
  void initState() {
    super.initState();
    main();
  }

  String miStringGlobal = '';

  Future<void> obtenerValorPrefCompartida() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    miStringGlobal = prefs.getString('link') ?? "https://www.google.com";
  }

  void main() async {
    await obtenerValorPrefCompartida();
  }

  double _progress = 0;
  late InAppWebViewController webView;
  GlobalKey<ScaffoldState> ScaffoldKey = GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: ScaffoldKey,
      appBar: AppBar(
        backgroundColor: Color(0xff041f40),
        elevation: 0,
        centerTitle: true,
        title: Text(
          "TEST",
          style: TextStyle(color: const Color.fromARGB(255, 255, 255, 255)),
        ),
      ),
      body: Stack(
        children: [
          InAppWebView(
            initialUrlRequest: URLRequest(url: Uri.parse(miStringGlobal)),
            onWebViewCreated: (InAppWebViewController controller) {
              webView = controller;
            },
            onProgressChanged:
                (InAppWebViewController controller, int progress) {
              setState(() {
                _progress = progress / 100;
              });
            },
          ),
          _progress < 1
              ? SizedBox(
                  height: 3,
                  child: LinearProgressIndicator(
                    value: _progress,
                    backgroundColor: Colors.red.withOpacity(0.2),
                  ),
                )
              : SizedBox()
        ],
      ),
    );
  }
}


I attach the code and I would like you to tell me where my error can be.


Solution

  • Try to change inti var miStringGlobal

    from this String miStringGlobal = ''; to this String miStringGlobal = "https://www.google.com";

    if its load google then the problem is your widget is start to build before init, in that case

    add some loading flag

    import 'package:flutter/material.dart';
    import 'package:flutter_inappwebview/flutter_inappwebview.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    
    class Webpage extends StatefulWidget {
     const Webpage({super.key});
     @override
     State<Webpage> createState() => _WebpageState();
    }
    
    class _WebpageState extends State<Webpage> {
    String initialUrl = '';
    bool isloading=false;
    
    
     @override
     void initState() {
      super.initState();
      isloading=true;
      main();
      }
    
      String miStringGlobal = '';
    
     Future<void> obtenerValorPrefCompartida() async {
     SharedPreferences prefs = await SharedPreferences.getInstance();
     miStringGlobal = prefs.getString('link') ?? "https://www.google.com";
     setState(() {
       isloading=false;
      });
     }
    
      void main() async {
       await obtenerValorPrefCompartida();    
      
      }
    
     double _progress = 0;
     late InAppWebViewController webView;
     GlobalKey<ScaffoldState> ScaffoldKey = GlobalKey<ScaffoldState>();
    
     @override
     Widget build(BuildContext context) {
      return Scaffold(
      key: ScaffoldKey,
      appBar: AppBar(
        backgroundColor: Color(0xff041f40),
        elevation: 0,
        centerTitle: true,
        title: Text(
          "TEST",
          style: TextStyle(color: const Color.fromARGB(255, 255, 255, 255)),
        ),
      ),
      body:isloading?Text("loading"): Stack(
        children: [
          InAppWebView(
            initialUrlRequest: URLRequest(url: Uri.parse(miStringGlobal)),
            onWebViewCreated: (InAppWebViewController controller) {
              webView = controller;
            },
            onProgressChanged:
                (InAppWebViewController controller, int progress) {
              setState(() {
                _progress = progress / 100;
              });
            },
          ),
          _progress < 1
              ? SizedBox(
                  height: 3,
                  child: LinearProgressIndicator(
                    value: _progress,
                    backgroundColor: Colors.red.withOpacity(0.2),
                  ),
                )
              : SizedBox()
        ],
      ),
    );
    }
    }