Flutter基础架构插件bedrock的使用

Flutter基础架构插件bedrock的使用

bedrock 是一个简化 Flutter 应用构建过程的插件。通过它,你可以更轻松地处理屏幕常亮等功能,并且可以简化 UI 更新。

功能

  • BedrockWidgetBuilder(基于 Get

使用方法

屏幕常亮功能

要设置屏幕不睡眠,可以使用以下代码:

await Bedrock.instance.wakelock.enable();

使用 BedrockWidgetBuilder 简化 UI 更新

创建控制器

class Controller extends BedrockController {
  static Controller get instance => Get.find();

  int _count = 0;

  int get count => _count;

  void increase() {
    _count++;
    update(); // 触发更新
  }
}

创建一个 widget

class Counter extends BedrockWidget<Controller> {
  const Counter({super.key, required super.controller});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text('${controller.count}');
  }
}

创建一个 builder

class CounterBuilder extends BedrockWidgetBuilder<Controller, Counter> {
  const CounterBuilder({super.key, super.group, required super.child});
}

在需要的地方插入控制器并添加 builder

Get.lazyPut<Controller>(() => Controller());

CounterBuilder(
  child: (Controller controller) => Counter(controller: controller),
)

在任何地方操作控制器

final Controller controller => Get.find();
controller.increase();

完整示例

以下是完整的示例代码,展示了如何使用 bedrock 插件来管理屏幕常亮状态和更新 UI。

import 'dart:async';

import 'package:bedrock/bedrock.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final Native _native = Get.put(Native());

  [@override](/user/override)
  void initState() {
    super.initState();
    _native.updateWakelockStatus();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Bedrock Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              NativeWidgetBuilder(
                  child: (Native controller) =>
                      WakelockStatus(controller: controller)),
              NativeWidgetBuilder(
                  child: (Native controller) =>
                      ChangeWakelockButton(controller: controller)),
            ],
          ),
        ),
      ),
    );
  }
}

class Native extends BedrockController {
  bool? _wakelockStatus;

  bool? get wakelockStatus => _wakelockStatus;

  Future<bool?> updateWakelockStatus() async {
    try {
      _wakelockStatus = await Bedrock.instance.wakelock.status();
      update();
    } on PlatformException catch (_) {
      // do nothing
    }
  }

  Future<void> changeWakelock(bool enable) async {
    try {
      await Bedrock.instance.wakelock.enable(enable);
      _wakelockStatus = enable;
      update();
    } on PlatformException catch (_) {
      // do nothing
    }
  }
}

abstract class NativeWidget extends BedrockWidget<Native> {
  const NativeWidget({super.key, required super.controller});
}

class WakelockStatus extends NativeWidget {
  const WakelockStatus({super.key, required super.controller});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text('Wakelock status is: ${controller.wakelockStatus}\n');
  }
}

class ChangeWakelockButton extends NativeWidget {
  const ChangeWakelockButton({super.key, required super.controller});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () =>
          controller.changeWakelock(!(controller.wakelockStatus ?? false)),
      child: Text(controller.wakelockStatus ?? false ? '禁用' : '启用'),
    );
  }
}

class NativeWidgetBuilder extends BedrockWidgetBuilder<Native, NativeWidget> {
  const NativeWidgetBuilder({super.key, super.group, required super.child});
}

更多关于Flutter基础架构插件bedrock的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter基础架构插件bedrock的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


bedrock 是 Flutter 中的一个基础架构插件,旨在帮助开发者构建更加模块化、可维护和可扩展的 Flutter 应用。它通常用于提供一些常见的应用架构模式,如状态管理、依赖注入、路由管理等,以简化开发流程并提高代码质量。

主要功能

bedrock 插件通常包括以下功能:

  1. 状态管理:提供基于 ProviderRiverpod 的状态管理解决方案,帮助开发者更好地管理应用的状态。
  2. 依赖注入:通过依赖注入机制,简化对象之间的依赖关系管理,提高代码的可测试性和可维护性。
  3. 路由管理:提供便捷的路由管理功能,支持页面跳转、参数传递等常见路由操作。
  4. 网络请求:封装了常见的网络请求库(如 Diohttp),提供统一的网络请求接口。
  5. 数据持久化:提供本地数据存储方案,如 SharedPreferencesHive,方便开发者进行数据持久化操作。
  6. 工具类:提供一些常用的工具类,如日志记录、设备信息获取等,帮助开发者快速实现常见功能。

基本使用

安装

首先,在 pubspec.yaml 中添加 bedrock 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  bedrock: ^1.0.0  # 请根据实际情况使用最新版本

然后运行 flutter pub get 来安装依赖。

使用示例

1. 状态管理

假设我们使用 Provider 进行状态管理:

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

class CounterModel extends ChangeNotifier {
  int _count = 0;
  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (_) => CounterModel(),
      child: MaterialApp(
        home: HomeScreen(),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    var counter = Provider.of<CounterModel>(context);
    return Scaffold(
      appBar: AppBar(title: Text('Counter App')),
      body: Center(
        child: Text('Count: ${counter.count}'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => counter.increment(),
        child: Icon(Icons.add),
      ),
    );
  }
}

void main() => runApp(MyApp());
2. 依赖注入

bedrock 可能提供了依赖注入的机制,类似:

import 'package:bedrock/bedrock.dart';

class ApiService {
  void fetchData() {
    print('Fetching data...');
  }
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Injector(
      providers: [
        Provider<ApiService>.value(ApiService()),
      ],
      child: MaterialApp(
        home: HomeScreen(),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    var apiService = Injector.of<ApiService>(context);
    return Scaffold(
      appBar: AppBar(title: Text('Dependency Injection')),
      body: Center(
        child: ElevatedButton(
          onPressed: () => apiService.fetchData(),
          child: Text('Fetch Data'),
        ),
      ),
    );
  }
}

void main() => runApp(MyApp());
3. 路由管理

bedrock 可能提供了便捷的路由管理功能:

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      onGenerateRoute: Router.generateRoute,
      initialRoute: '/',
    );
  }
}

class Router {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch (settings.name) {
      case '/':
        return MaterialPageRoute(builder: (_) => HomeScreen());
      case '/details':
        return MaterialPageRoute(builder: (_) => DetailsScreen());
      default:
        return MaterialPageRoute(builder: (_) => NotFoundScreen());
    }
  }
}

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home')),
      body: Center(
        child: ElevatedButton(
          onPressed: () => Navigator.pushNamed(context, '/details'),
          child: Text('Go to Details'),
        ),
      ),
    );
  }
}

class DetailsScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Details')),
      body: Center(
        child: Text('This is the details screen'),
      ),
    );
  }
}

class NotFoundScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Not Found')),
      body: Center(
        child: Text('Page not found'),
      ),
    );
  }
}

void main() => runApp(MyApp());
回到顶部