Flutter屏幕适配与工具函数插件flutter_fit_utils_provider的使用

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

Flutter屏幕适配与工具函数插件flutter_fit_utils_provider的使用

标题

Flutter屏幕适配与工具函数插件flutter_fit_utils_provider的使用

内容

此包是一个用于轻松创建模型数据提供者的Flutter包。该包是flutter_fit_utils环境的一部分。要了解其他与flutter_fit_utils相关的包,请查看下方的图表。

flutter_fit_utils drawio

特性

此包允许您使用预建的提供者或自定义提供者来管理您的模型数据。这些提供者随后会使用服务来管理您的数据存储库。

开始使用

  1. 进入您的pubspec.yaml文件
  2. 在dependencies部分添加以下行:
flutter_fit_utils_provider: ^1.0.0

获取依赖项

flutter pub get

使用

请参阅example/main.dart以获取完整的实现示例。

创建一个提供者

创建一个继承自DataProvider或ItemsProvider的类。如果需要单个模型,则使用DataProvider;如果需要列表,则使用ItemsProvider。非常简单!

/// Provider for [User] data.
class UserProvider extends DataProvider<User> {
  /// Creates a new [UserProvider].
  UserProvider(super.service, super.factoryFunc);

  [@override](/user/override)
  bool isInstanceValid(User instance) {
    /// Implement your logic here...
    return instance.name != "Bob";
  }
}

如果您需要,可以覆盖方法以实现自己的逻辑。

/// Provider for [User] data.
class UserProvider extends DataProvider<User> {
  /// Creates a new [UserProvider].
  UserProvider(super.service, super.factoryFunc);

  [@override](/user/override)
  Future<void> initialize({dynamic data, String userId = ""}) async {
    /// Your own logic here.
  }

  [@override](/user/override)
  bool isInstanceValid(User instance) {
    /// Implement your logic here...
    return instance.name != "Bob";
  }
}

您可以始终通过继承FitProvider或FitFormProvider来自定义提供者。

等待提供者的初始化

FitProviders有一个初始化流,您可以监听它。这样,当您的提供者准备好时,您可以更新UI。

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return StreamBuilder<bool>(
      stream: context.read<UserProvider>().initializationStream,
      builder: (context, snapshot) {
        if (!context.watch<UserProvider>().initialized) {
          return const CircularProgressIndicator();
        }

        // Show your UI here.
        return const SizedBox.shrink();
      },
    );
  }
}

补充信息

随时提供反馈!此包也接受贡献。


示例代码

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_fit_utils/flutter_fit_utils.dart';
import 'package:flutter_fit_utils_provider/flutter_fit_utils_provider.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider<UserProvider>(
            create: (_) => UserProvider(
                FirestoreService<User>("MyFirestoreCollection", User.fromModel),
                () => const User())),
      ],
      child: const MyApp(),
    ),
  );
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return StreamBuilder<bool>(
      stream: context.read<UserProvider>().initializationStream,
      builder: (context, snapshot) {
        if (!context.watch<UserProvider>().initialized) {
          return const CircularProgressIndicator();
        }

        // Show your UI here.
        return const SizedBox.shrink();
      },
    );
  }
}

/// Provider for [User] data.
class UserProvider extends DataProvider<User> {
  /// Creates a new [UserProvider].
  UserProvider(super.service, super.factoryFunc);

  [@override](/user/override)
  bool isInstanceValid(User instance) {
    /// Implement your logic here...
    return instance.name != "Bob";
  }
}

/// Example user class.
class User extends Modelable {
  static const String _nameKey = "name";

  /// User's last name.
  final String name;

  /// Creates a new user.
  const User({this.name = "", super.id, super.userId});

  /// Creates an invalid user.
  const User.invalid()
      : name = "",
        super.invalid();

  /// Creates a user from a [Model].
  User.fromModel(super.model)
      : name = model.data[_nameKey].toString(),
        super.fromModel();

  [@override](/user/override)
  User copyWith({String? id, String? userId, bool? invalid, String? name}) =>
      User(
        name: name ?? this.name,
        id: id ?? this.id,
        userId: userId ?? this.userId,
      );

  [@override](/user/override)
  Model toModel() => Model(
        id: id,
        userId: userId,
        data: {
          _nameKey: name,
        },
      );
}

更多关于Flutter屏幕适配与工具函数插件flutter_fit_utils_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter屏幕适配与工具函数插件flutter_fit_utils_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中进行屏幕适配通常涉及到布局和尺寸的调整,以确保应用在不同屏幕尺寸和分辨率的设备上都能保持一致的视觉效果。flutter_fit_utils_provider 是一个帮助进行屏幕适配的插件,它提供了一系列工具函数来简化这一过程。以下是如何在Flutter项目中使用 flutter_fit_utils_provider 插件来实现屏幕适配的代码案例。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_fit_utils_provider 的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_fit_utils_provider: ^最新版本号  # 请替换为最新的版本号

然后运行 flutter pub get 来获取依赖。

2. 初始化插件

在你的 Flutter 应用的主文件中(通常是 main.dart),初始化 FlutterFitUtilsProvider

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

void main() {
  // 初始化 FlutterFitUtilsProvider
  WidgetsFlutterBinding.ensureInitialized();
  FlutterFitUtilsProvider.init();

  runApp(MyApp());
}

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

3. 使用工具函数进行屏幕适配

flutter_fit_utils_provider 提供了一些静态方法用于屏幕适配,例如获取屏幕宽度、高度、缩放比例等。以下是如何使用这些方法的示例:

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    double screenWidth = FlutterFitUtils.screenWidth;
    double screenHeight = FlutterFitUtils.screenHeight;
    double scaleWidth = FlutterFitUtils.scaleWidth(375); // 将设计稿宽度设为375
    double scaleHeight = FlutterFitUtils.scaleHeight(667); // 将设计稿高度设为667

    return Scaffold(
      appBar: AppBar(
        title: Text('屏幕适配示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '屏幕宽度: $screenWidth px',
              style: TextStyle(fontSize: scaleWidth(20)), // 使用scaleWidth来适配字体大小
            ),
            Text(
              '屏幕高度: $screenHeight px',
              style: TextStyle(fontSize: scaleWidth(20)),
            ),
            SizedBox(height: scaleHeight(20)),
            Container(
              width: scaleWidth(200),
              height: scaleHeight(100),
              color: Colors.blue,
              child: Center(
                child: Text(
                  '适配后的容器',
                  style: TextStyle(color: Colors.white, fontSize: scaleWidth(16)),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  // 封装scaleWidth和scaleHeight的便捷方法
  double scaleWidth(double size) => FlutterFitUtils.scaleWidth(size);
  double scaleHeight(double size) => FlutterFitUtils.scaleHeight(size);
}

4. 运行应用

完成上述步骤后,运行你的 Flutter 应用。你应该会看到一个根据屏幕尺寸进行适配的界面,包括文本大小和容器尺寸。

这个示例展示了如何使用 flutter_fit_utils_provider 插件进行基本的屏幕适配。根据实际需求,你可以进一步封装和扩展这些工具函数,以适应更复杂的UI设计。

回到顶部