Flutter插件fluto的介绍与使用 Flutter功能扩展插件fluto的使用

发布于 1周前 作者 bupafengyu 最后一次编辑是 5天前 来自 Flutter

Flutter插件fluto的介绍与使用

Flutter功能扩展插件fluto的使用

Fluto 是一个用于Flutter应用的设备端调试框架,可以帮助检查HTTP请求/响应,捕获崩溃和ANR,并实时操纵应用程序数据。

你可以通过扩展 Pluggable 抽象类来创建自己的插件。该插件附带了一个UI来监控和共享信息,以及API供你在应用中访问和使用这些信息。

示例用法

void main() {
  FlutoPluginManager.registerAllPlugins([
    ScreenLauncherPlugin(
      devIdentifier: 'one',
      screen: Scaffold(
        appBar: AppBar(title: const Text("first screen")),
        body: const Text("first screen"),
      ),
      name: "first screen",
    )
  ]);

  runApp(Fluto(navigatorKey: navigatorKey, child: const MyApp()));
}

问题

请在我们的 GitHub 页面上提交任何问题、错误报告或功能请求。商业支持可用,如有需要请联系 shashankgupta3891@gmail.com

想要贡献

如果你希望为插件做出贡献(例如改进文档、解决错误或添加新功能),请发送你的 pull request

作者

此Geolocator插件由 Shashank Gupta 开发。


完整示例Demo

以下是一个完整的示例,展示了如何使用 fluto 插件。

import 'dart:typed_data';
import 'package:alice/alice.dart';
import 'package:alice/core/alice_http_extensions.dart';
import 'package:dio/dio.dart';
import 'package:example/core/fluto/fluto_storage.dart';
import 'package:example/core/fluto/plugin.dart';
import 'package:file_saver/file_saver.dart';
import 'package:fluto/fluto.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:http/http.dart' as http;
import 'package:permission_handler/permission_handler.dart';
import 'package:shared_preferences/shared_preferences.dart';

GlobalKey<NavigatorState> navigatorKey = GlobalKey();

FlutoDynamicBaseUrlManager flutoDynamicBaseUrlManager =
    FlutoDynamicBaseUrlManager(() async {
  return "http://www.salfjas.asfjl";
});

FlutoHTTPClient client = FlutoHTTPClient();

class FlutoHTTPClient extends http.BaseClient {
  [@override](/user/override)
  Future<http.StreamedResponse> send(http.BaseRequest request) async {
    final newBaseUrl = await flutoDynamicBaseUrlManager.getDynamicBaseUrl();
    print(newBaseUrl);

    final response = await request.send();

    return response;
  }
}

Alice alice = Alice(navigatorKey: navigatorKey);

Uri url = Uri();
final dio = Dio(BaseOptions(baseUrl: 'https://jsonplaceholder.typicode.com/'));

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  dio.interceptors.add(alice.getDioInterceptor());

  dio.interceptors.add(InterceptorsWrapper(
    onRequest: (options, handler) {
      // options.copyWith()
      // options.copyWith(baseUrl: "baseUrl");
      // handler.next(options);
      // options.
    },
  ));

  await setupSharedPreference();
  await setupFlutterSecureStorage();
  FlutoPluginRegistrar.registerAllPlugins(
    [
      ScreenLauncherPlugin(
        devIdentifier: 'one',
        screen: Scaffold(
          appBar: AppBar(title: const Text("first screen")),
          body: const Text("first screen"),
        ),
        name: "first screen",
      ),
      StorageTestPlugin(devIdentifier: "storage_test"),
      FlutoDynamicBaseUrlPlugin(
        devIdentifier: 'base_url_change',
        flutoDynamicBaseUrlManager: flutoDynamicBaseUrlManager,
      ),
      ClickLauncherPlugin(
        devIdentifier: "Alice Launcher",
        name: "Alice Launcher",
        onClick: () {
          alice.showInspector();
        },
      )
    ],
  );

  runApp(Fluto(
    navigatorKey: navigatorKey,
    storage: SharedPreferencesFlutoStorage(),
    child: const MyApp(),
  ));
}

Future<void> setupFlutterSecureStorage() async {
  const storage = FlutterSecureStorage();

  await storage.write(key: 'counter', value: "1302");
  await storage.read(key: 'repeat');
}

Future<void> setupSharedPreference() async {
  try {
    final prefs = await SharedPreferences.getInstance();

    await prefs.setInt('counter', 10);
    await prefs.setBool('repeat', true);
    await prefs.setDouble('decimal', 1.5);
    await prefs.setString('action', 'Start');
    await prefs.setStringList('items', ['Earth', 'Moon', 'Sun']);
  } catch (e, s) {
    log("SharedPref Init", error: e, stackTrace: s);
  }
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: navigatorKey,
      title: 'Flutter Demo',
      builder: (context, child) => FlutoScreenWrapper(child: child!),
      theme: ThemeData.dark(),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

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

  void _incrementCounter() async {
    var status = await Permission.storage.status;
    print(status);

    if (status.isDenied) {
      Map<Permission, PermissionStatus> statuses = await [
        Permission.storage,
        Permission.camera,
      ].request();

    } else if (status.isGranted) {
      Uint8List data = Uint8List.fromList('Hello World!'.codeUnits);

      String path = await FileSaver.instance
          .saveFile("Fluto_saved_data", data, "txt", mimeType: MimeType.TEXT);
      log(path);
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            ElevatedButton(
              onPressed: () async {
                final generatedUrl = await flutoDynamicBaseUrlManager.getHttpUri('');
                print("generatedUrl: $generatedUrl");

                client.get(generatedUrl).interceptWithAlice(alice);
                try {
                  final response = await dio.get('posts');
                  print(response);
                } catch (e, s) {
                  print(e);
                  print(s);
                }
              },
              child: const Text("API Call"),
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

更多关于Flutter插件fluto的介绍与使用 Flutter功能扩展插件fluto的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件fluto的介绍与使用 Flutter功能扩展插件fluto的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


fluto 是 Flutter 社区中一个相对较新的插件,由于官方文档或社区中缺乏详细的介绍,我们只能基于其名称和常见的 Flutter 插件命名规范来推测其功能和用途。

名称推测

  • Flutter + Pluto: fluto 可能是 “Flutter” 和 “Pluto” 的组合。Pluto 是一个轻量级的、灵活的数据库工具,因此 fluto 可能与数据库操作或数据管理有关。
  • Flutter + Util: “Util” 是 “Utility” 的缩写,表示工具或实用程序。因此,fluto 可能是一个提供各种实用工具的插件,帮助开发者更高效地开发 Flutter 应用。

可能的功能

基于上述推测,fluto 可能提供以下功能之一或组合:

  1. 数据库管理: 提供轻量级的数据库操作接口,类似于 SQLite 或其他 NoSQL 数据库的封装。
  2. 实用工具: 提供常用的工具函数或类,如字符串处理、日期格式化、网络请求封装等。
  3. 状态管理: 提供一种新的状态管理解决方案,类似于 ProviderRiverpod,但可能有其独特的设计理念。
  4. UI 组件: 提供一组新的 UI 组件或动画效果,帮助开发者快速构建复杂的用户界面。

使用推测

由于没有具体的文档,以下是对 fluto 插件使用的推测步骤:

  1. 安装插件: 在 pubspec.yaml 文件中添加 fluto 插件的依赖。

    dependencies:
      fluto: ^latest_version
  2. 导入插件: 在需要使用 fluto 的 Dart 文件中导入插件。

    import 'package:fluto/fluto.dart';
  3. 初始化插件: 根据插件的功能,可能需要在应用启动时进行初始化。

    void main() {
      Fluto.init();
      runApp(MyApp());
    }
  4. 使用插件功能: 根据插件的具体功能,调用相应的 API 或组件。

    // 假设 fluto 提供数据库操作功能
    var db = FlutoDatabase();
    db.insert('table_name', {'key': 'value'});
    
    // 假设 fluto 提供实用工具
    String formattedDate = FlutoUtils.formatDate(DateTime.now());
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!