如果 API 无法获取文件,则显示不同的小部件

Posted

技术标签:

【中文标题】如果 API 无法获取文件,则显示不同的小部件【英文标题】:Show different widget if API fails to fetch files 【发布时间】:2021-05-01 06:53:30 【问题描述】:

我正在开发一个应用程序,如果 API 无法获取数据并显示 ListView.builder() 是 API 获取数据,我需要显示一个按钮。

目前的进度是,如果 API 获取数据,会显示 ListView.builder(),但如果无法获取数据,则不会显示 Button,并且进度指示器会继续运行。

这是我的代码..

import 'package:flutter/material.dart';

import '../Services/fetch_nifty_data.dart';

class NiftyScreen extends StatefulWidget 
  @override
  _NiftyScreenState createState() => _NiftyScreenState();


class _NiftyScreenState extends State<NiftyScreen> 
  Map<String, dynamic>? niftyDetails = ;
  late bool? isLoading;

  @override
  void initState() 
    super.initState();
    getNiftyData();
  

  getNiftyData() async 
    setState(() 
      isLoading = true;
    );
    this.niftyDetails = await fetchNiftyData();
    setState(() 
      isLoading = false;
    );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: isLoading!
          ? LinearProgressIndicator()
          : niftyDetails!.isNotEmpty
              ? ListView.builder(
                  itemCount: niftyDetails!["filtered"]["data"].length,
                  itemBuilder: (_, index) 
                    return ListTile(
                      title: Text(
                          '$niftyDetails!["filtered"]["data"][index]["strikePrice"]'),
                    );
                  ,
                )
              : Center(
                  child: MaterialButton(
                    onPressed: getNiftyData,
                    child: Text(
                      'Nothing to show. Refetch?',
                      style: TextStyle(
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                    color: Colors.red[900],
                    textColor: Colors.white,
                  ),
                ),
    );
  


谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

Flutter 有一个很棒的小部件,称为 FutureBuilder,它可以完美解决您的问题。我在下面添加了一个基本示例,如果您有任何问题,请告诉我。


class App extends StatefulWidget 
  @override
  _AppState createState() => _AppState();


class _AppState extends State<App> 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: FutureBuilder(
        future: fetchNiftyData(),
        builder: (BuildContext context, AsyncSnapshot snapshot) 
          // The request is processing.
          if (snapshot.connectionState == ConnectionState.waiting) 
            return const CircularProgressIndicator();
           //
          // An error has occured.
          else if (snapshot.hasError) 
            return const Center(child: Text('An error occured!'));,
           //
          // The request was successfull.
          else if (snapshot.hasData) 
            return ListView.builder(
              // Your listview that displays the data.
            );
          

          return Container();
        ,
      ),
    );
  



【讨论】:

以上是关于如果 API 无法获取文件,则显示不同的小部件的主要内容,如果未能解决你的问题,请参考以下文章

Qt 中的样式表、隐藏的小部件和大小

如何在时间轴中显示多个条目内容?

无法获取小部件的高度/宽度 - gtkmm

如何在 Flutter 中使用 Provider 正确获取 API

获取当前活动的小部件

在 Flutter 中当 bool 值为 true 和 false 时显示不同的小部件