Недостаточно быстрое получение значений в веб-представлении - PullRequest
1 голос
/ 01 мая 2020

Эй, проблема, с которой я столкнулся, немного необычна. Поэтому я использую веб-представления, и в качестве intialUrl я использую значение, полученное из Google cloud_ firestore. Теперь, чтобы получить эту ссылку из моей базы данных fireStore, требуется около 2 секунд и в течение этого времени мой код работает и думает, что переменная thankGod пуста. Так что даже виджет Text говорит, что переменная thankGod равна нулю в течение первых 2 секунд, а затем возвращает значение после ... Но это не так хорошо, потому что мой webView использует переменную thankGod, когда она пуста. Вот мой код.

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:webview_flutter/webview_flutter.dart';


class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}


class _HomeState extends State<Home> {
final Completer<WebViewController> _completer = Completer<WebViewController>();
DocumentReference documentReference = Firestore.instance.collection('dailyPictures').document('t1');
    Future<void> getData() async{
     await documentReference.get().then((datasnapshots) {

                setState(() {
                   thankGod = datasnapshots.data['picture1'];
                });

     });
   }


String thankGod;


   @override
  void initState() {
    super.initState();
    getData();



  }

@override
   Widget build(BuildContext context) {
   return Scaffold(
       backgroundColor: Colors.black,
        body: Container(
        decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(1800),
            ),
        height: MediaQuery.of(context).size.height,
        width: MediaQuery.of(context).size.width,
        margin: EdgeInsets.fromLTRB(
        20,
        20,
        20,
        20
        ),
        child: 
        Text(
          thankGod,
          style: TextStyle(
            color: Colors.white,
            fontSize:32
          ),
        )

               WebView(
         initialUrl: thankGod,
         debuggingEnabled: true,
         javascriptMode: JavascriptMode.unrestricted,
         onWebViewCreated: ((WebViewController webViewController){

           _completer.complete(webViewController);
             }),
            ),


   ));

  }
}

Пожалуйста, мне нужна помощь. Помогите поделиться этим вопросом

1 Ответ

1 голос
/ 01 мая 2020

сделать тип возвращаемого значения String для функции getData;

Future<String> getData() async {
  DocumentSnapshot = await documentReference.get();
  return datasnapshots.data['picture1'];
}

и использовать FutureBuilder для получения данных и построения веб-представления;

FutureBuilder<String>(
  future: getData(),
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      String initialUrl = snapshot.data;
      return WebView(
        initialUrl: initialUrl,
        debuggingEnabled: true,
        javascriptMode: JavascriptMode.unrestricted,
        onWebViewCreated: ((WebViewController webViewController) {
          _completer.complete(webViewController);
        }),
      );
    }
    return CircularProgressIndicator();
  },
)

примечание: вам не нужно Звоните getData() внутри initState.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...