Flutter插件fluto的介绍与使用 Flutter功能扩展插件fluto的使用
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
更多关于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
可能提供以下功能之一或组合:
- 数据库管理: 提供轻量级的数据库操作接口,类似于 SQLite 或其他 NoSQL 数据库的封装。
- 实用工具: 提供常用的工具函数或类,如字符串处理、日期格式化、网络请求封装等。
- 状态管理: 提供一种新的状态管理解决方案,类似于
Provider
或Riverpod
,但可能有其独特的设计理念。 - UI 组件: 提供一组新的 UI 组件或动画效果,帮助开发者快速构建复杂的用户界面。
使用推测
由于没有具体的文档,以下是对 fluto
插件使用的推测步骤:
-
安装插件: 在
pubspec.yaml
文件中添加fluto
插件的依赖。dependencies: fluto: ^latest_version
-
导入插件: 在需要使用
fluto
的 Dart 文件中导入插件。import 'package:fluto/fluto.dart';
-
初始化插件: 根据插件的功能,可能需要在应用启动时进行初始化。
void main() { Fluto.init(); runApp(MyApp()); }
-
使用插件功能: 根据插件的具体功能,调用相应的 API 或组件。
// 假设 fluto 提供数据库操作功能 var db = FlutoDatabase(); db.insert('table_name', {'key': 'value'}); // 假设 fluto 提供实用工具 String formattedDate = FlutoUtils.formatDate(DateTime.now());