Flutter资源加载插件load的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter资源加载插件load的使用

pub package GitHub

load 是一个全局加载组件,可以通过简单的配置来使用。它是一个纯Flutter库,不使用原生代码。使用方式类似于 OKToast

目录

ScreenShot

Screenshot_2019-05-21-14-08-42-731_com.example.ex.png

Usage

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  load: $latest_version

导入

在 Dart 文件中导入 load 包:

import 'package:load/load.dart';

包裹你的应用

LoadingProvider 包裹在你的应用根部:

void main() {
  runApp(
    LoadingProvider(
      child: MyApp(),
    ),
  );
}

// 或者

LoadingProvider(
  child: MaterialApp(),
);

你也可以在 MaterialAppbuilder 中包含 LoadingProvider

MaterialApp(
  builder: (context, widget) {
    return LoadingProvider(
      child: widget,
    );
  },
);

显示或隐藏对话框

使用以下方法显示或隐藏加载对话框:

showLoadingDialog();
showCustomLoadingWidget(Container()); // 自定义对话框
hideLoadingDialog();

Advanced Usage

Custom Loading Widget

使用 LoadingThemeDataloadingWidgetBuilder 来自定义加载组件:

LoadingProvider(
  themeData: LoadingThemeData(),
  loadingWidgetBuilder: (ctx, data) {
    return Center(
      child: SizedBox(
        width: 30,
        height: 30,
        child: Container(
          child: CupertinoActivityIndicator(),
          color: Colors.blue,
        ),
      ),
    );
  },
  child: MyApp(),
);

image

Custom some config

所有参数都是可选的:

参数 类型 默认值 描述
backgroundColor Color Colors.black54 背景透明遮罩
tapDismiss bool true 点击背景是否关闭?
loadingBackgroundColor Color Colors.white 中心加载组件的背景颜色
loadingPadding EdgeInsets EdgeInsets.all(8.0) 中心加载组件的内边距
loadingSize Size Size(55,55) 中心加载组件的大小
animDuration Duration Duration(milliseconds: 300) 显示/隐藏动画时间

示例代码

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:load/load.dart';

void main() {
  runApp(
    LoadingProvider(
      themeData: LoadingThemeData(
          // tapDismiss: false,
          ),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

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

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
    showAndDelayDismiss();
  }

  void showAndDelayDismiss([Duration duration = const Duration(seconds: 2)]) async {
    var future = await showLoadingDialog();
    Future.delayed(duration, () {
      future.dismiss();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: [
          buildDefaultDialog(),
          buildCustomLoadingButton(),
          buildTouchLoadingDialog(),
        ],
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }

  Widget buildCustomLoadingButton() {
    return IconButton(
      icon: Icon(Icons.cloud_download),
      onPressed: () {
        showCustomLoadingWidget(
          Center(
            child: Container(
              padding: const EdgeInsets.all(30),
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  LinearProgressIndicator(),
                  Container(height: 10),
                  Text("loading"),
                  TextButton(
                    onPressed: () {
                      hideLoadingDialog();
                    },
                    child: Text('dismiss'),
                  ),
                ],
              ),
            ),
          ),
          tapDismiss: false,
        );
      },
    );
  }

  Widget buildTouchLoadingDialog() {
    return IconButton(
      icon: Icon(Icons.touch_app),
      onPressed: () {
        showCustomLoadingWidget(
          Center(
            child: Container(
              padding: const EdgeInsets.all(30),
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  Container(
                    width: 40,
                    height: 40,
                    color: Colors.blue,
                    child: CupertinoActivityIndicator(radius: 10),
                  ),
                  Container(height: 10),
                  TextButton(
                    child: Text("Add"),
                    onPressed: () {
                      _counter++;
                      setState(() {});
                      print("touch Add button, this counter is :$_counter");
                    },
                  ),
                ],
              ),
            ),
          ),
        );
      },
    );
  }

  Widget buildDefaultDialog() {
    return IconButton(
      icon: Icon(Icons.slideshow),
      onPressed: () {
        showLoadingDialog();
      },
    );
  }

  Widget exampleLoadApp() {
    return LoadingProvider(
      themeData: LoadingThemeData(),
      loadingWidgetBuilder: (ctx, data) {
        return Center(
          child: SizedBox(
            width: 30,
            height: 30,
            child: Container(
              child: CupertinoActivityIndicator(),
              color: Colors.blue,
            ),
          ),
        );
      },
      child: MyApp(),
    );
  }
}

希望这些内容对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter资源加载插件load的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter资源加载插件load的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,load 并不是一个官方提供的资源加载插件的名称。不过,假设你提到的是一个自定义的或第三方资源加载插件,并且这个插件的名字或者某个关键功能叫做 load,我们可以模拟一个类似的资源加载插件的使用案例。

通常情况下,Flutter中的资源加载可能涉及到加载图片、JSON数据或其他类型的文件。为了说明如何使用一个假设的 load 插件来加载资源,我将展示一个简化的示例,该示例使用了一个假想的 ResourceLoader 类,它有一个 load 方法用于加载资源。

假设的 ResourceLoader

首先,我们定义一个假设的 ResourceLoader 类,它有一个 load 方法,用于从应用程序的资源目录中加载文件内容。

import 'dart:io';
import 'dart:convert';

class ResourceLoader {
  // 模拟加载资源的方法
  Future<String> load(String filePath) async {
    File file = File(filePath);
    if (!await file.exists()) {
      throw Exception("File not found: $filePath");
    }
    String contents = await file.readAsString();
    return contents;
  }
}

使用 ResourceLoader 加载 JSON 数据

接下来,我们展示如何使用这个 ResourceLoader 类来加载一个 JSON 文件,并将其解析为 Dart 对象。

假设我们有一个名为 data.json 的文件,其内容如下:

{
  "name": "Flutter",
  "version": "3.0.0"
}

我们可以创建一个 Dart 类来表示这个 JSON 数据结构:

class AppData {
  String name;
  String version;

  AppData({required this.name, required this.version});

  // 从 JSON 映射中创建 AppData 实例
  factory AppData.fromJson(Map<String, dynamic> json) {
    return AppData(
      name: json['name'] as String,
      version: json['version'] as String,
    );
  }
}

然后,我们使用 ResourceLoader 来加载并解析这个 JSON 文件:

import 'dart:convert';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Resource Loader Example'),
        ),
        body: FutureBuilder<AppData>(
          future: _loadAppData('assets/data.json'), // 假设 JSON 文件位于 assets 目录下
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                AppData data = snapshot.data!;
                return Center(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Text('Name: ${data.name}'),
                      Text('Version: ${data.version}'),
                    ],
                  ),
                );
              }
            } else {
              return CircularProgressIndicator();
            }
          },
        ),
      ),
    );
  }

  Future<AppData> _loadAppData(String filePath) async {
    ResourceLoader loader = ResourceLoader();
    String jsonString = await loader.load(filePath);
    Map<String, dynamic> jsonMap = jsonDecode(jsonString);
    AppData appData = AppData.fromJson(jsonMap);
    return appData;
  }
}

注意:在 Flutter 中,通常资源文件(如 JSON 文件)会被放置在 assets 目录下,并且需要在 pubspec.yaml 文件中声明它们。然而,由于我们的 ResourceLoader 类是基于文件系统的,它实际上并不能直接加载 Flutter 的资产文件。在真实的应用中,你应该使用 Flutter 的 AssetBundle 来加载资产文件。

如果你确实想要模拟一个插件的行为,你可能需要创建一个真正的 Flutter 插件,它使用平台通道(platform channels)来与原生代码交互,以便在 Android 和 iOS 上加载资源。但上面的示例提供了一个基本的思路,展示了如何在 Dart 代码中模拟资源加载的过程。

回到顶部