【问题标题】:isLoading without setState? Flutter (CircularProgressIndicator)isLoading 没有 setState?颤振(CircularProgressIndicator)
【发布时间】:2022-01-19 19:48:44
【问题描述】:

我试过了

setState(() {isLoading = true})
//do something
setState(() {isLoading = false})

在 onTab(){}

但使用 setState 后,pdfFile 和 pdfController 等数据会被覆盖,并且应用不会推送到新路由。

好吧,我的问题是:如何向用户显示加载动画,如果加载完成,将下载的数据推送到屏幕?也许我需要一些没有 setState 的东西?我们有什么可能?

body: StreamBuilder(
        stream: firebase.base
            .collection('xxx')
            .doc(firebase.auth.currentUser!.uid)
            .collection("xxx")
            .snapshots(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasData) {

            final liste = snapshot.data!.docs;
               return Column(
              children: [
                Container(
                  height: 400,
                  child: ListView.builder(
                    padding: const EdgeInsets.all(8),
                    itemCount: liste.length,
                    itemBuilder: (BuildContext context, int index) {
                      Map data = snapshot.data!.docs[index].data() as Map;
                     String fileName = data['fileName'];
                     String url = data['url'];
                      return GestureDetector(
                        onTap: () async {
                          http.Response pdfFile =
                              await http.get(Uri.parse(url));

                          final pdfController = PdfController(
                              document:
                                  PdfDocument.openData(pdfFile.bodyBytes));

                          Navigator.push(
                              context,
                              MaterialPageRoute(
                                  builder: (context) =>
                                      PdfViewScreen(pdfController, fileName)));
                        },

【问题讨论】:

    标签: flutter dart setstate


    【解决方案1】:

    也许以下逻辑对你有用:

    onTap 仅将用户重定向到 PdfViewScreen。在 PdfViewScreen 中,您使用 FutureBuilder 来解析 http.get(Uri.parse(url)),之后 FutureBuilder 将返回您使用的 PDFviewer。然后在 FutureBuilder 中你可以显示一个 progressIndicator

    【讨论】:

    • 这有一半在起作用。我使用FutureBuilder 来获取pdf。 CircularProgressIndicator 正在工作,然后它将推送到 PdfViewScreen 但我无法按下后退按钮并出现一些错误。
    • 也许你可以上传你的新代码,也许能再次提供帮助
    • 我也尝试在其他屏幕中使用该代码,但我认为 showDialog 的事情不是以多种方式重用它的正确方法。
    【解决方案2】:

    您可以在大括号后使用else 表达式。或者在if之后只使用return Center(child: CircularProgressIndicator());

    【讨论】:

      【解决方案3】:
      
      
      
      body: StreamBuilder(
              stream: firebase.base
                  .collection('xxx')
                  .doc(firebase.auth.currentUser!.uid)
                  .collection("xxx")
                  .snapshots(),
              builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
                if (snapshot.hasData) {
                  final liste = snapshot.data!.docs;
                  return Column(
                    children: [
                      Container(
                        height: 400,
                        child: ListView.builder(
                          padding: const EdgeInsets.all(8),
                          itemCount: liste.length,
                          itemBuilder: (BuildContext context, int index) {
                            Map data = snapshot.data!.docs[index].data() as Map;
                            String fileName = data['fileName'];
                            String url = data['url'];
                            return GestureDetector(
                              onTap: () async {
                                Future<http.Response> pdfFile =
                                    http.get(Uri.parse(url));
                                showDialog(
                                    context: context,
                                    builder: (context) {
                                      return FutureBuilder<http.Response>(
                                          future: http.get(Uri.parse(url)),
                                          builder: (context, snapshot) {
                                            if (snapshot.hasData) {
                                              final pdfController = PdfController(
                                                  document: PdfDocument.openData(
                                                      snapshot.data!.bodyBytes));
      
                                              return PdfViewScreen(
                                                  pdfController, fileName);
                                            }
                                            return const Center(
                                                child: CircularProgressIndicator());
                                          });
                                    });
                              },
      
      
      
      

      【讨论】:

      • 将所有内容放在一起的有趣方式。我的想法实际上是您将屏幕与 StreamBuilder(用于请求带有 url 到 pdf 文件的列表的 StreamBuilder)一起使用,并在 onTap 事件中将用户导航到 PdfViewScreen。在 PdfViewScreen 中,您可以从 FutureBuilder 开始加载 pdfFile
      • @BJW 在 PdfScreen 中已经是来自插件的加载小部件 :)
      猜你喜欢
      • 2019-01-10
      • 2021-04-30
      • 1970-01-01
      • 2019-01-23
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 2023-04-04
      相关资源
      最近更新 更多