Flutter架构管理插件flutter_arch的使用

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

Flutter架构管理插件flutter_arch的使用

flutter_arch

flutter_arch 是一个用于帮助开发者更好地管理Flutter应用架构的插件。它包括ViewModel、LiveData及BaseViewState等组件,主要用于将业务逻辑和UI分离。

arch

ViewModel

ViewModel 用于处理业务逻辑,并为 BaseViewState 提供可观测的数据 LiveData

使用示例:

class HomeModel extends ViewModel {
  /// 可观测的数据
  LiveData<int> count = LiveData(0);

  HomeModel(BuildContext context) : super(context);

  @override
  void initData() {
    // 完成初始化数据工作
    count.setValue(1);
  }

  /// 提供给UI操作的数据的
  void incrementCounter() {
    var countValue = count.getValue() + 1;
    Future.delayed(
        const Duration(seconds: 3), () => count.setValue(countValue));
  }

  /// 释放资源
  @override
  void dispose() {}
}

BaseViewState

BaseViewState 是一个用于 State 的mixin类,为UI状态提供 ViewModel

使用示例:

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

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>
    with BaseViewState<MyHomePage, HomeModel> {
  int _counter = 0;

  @override
  void initState() {
    super.initState();
    // initState阶段使用getValue直接,从LiveData中获取数据
    _counter = model.count.getValue();
    // 观察LiveData中数据变化,第二lifecycleOwner会将观察者与State的生命周期绑定,当state 执行dispose后,观察者会自动取消注册。
    model.count.listen((t) {
      // 根据需要去更新UI
      setState(() {
        _counter = t;
      });
    }, lifecycleOwner: this);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            IconButton(
                iconSize: 100,
                color: Colors.amber,
                onPressed: () =>
                    Navigator.push(
                        context,
                        MaterialPageRoute(
                            builder: (_) => const MyHomePage(title: "第二个"))),
                icon: const Icon(Icons.nat)),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        // 通过model 操作数据。
        onPressed: () => model.incrementCounter(),
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }

  /// 实现该方法 会在initState阶段执行 创建Model
  @override
  HomeModel createModel() => HomeModel(context);
}

LiveData

LiveData 是一个数据持有类,可以通过 listen 方法观测数据的变化。listen 的第一个参数为数据变化的回调,可选参数 lifecycleOwner 类型为 BaseViewState,指定 lifecycleOwner 时,数据变化的回调会在 BaseViewState dispose时自动取消注册。如果 LiveData 不指定 lifecycleOwner,则需要手动移除数据变化的回调。

使用示例:

class UserInfo {
  String name;

  UserInfo(this.name, this.account);

  String account;
}

LiveData<UserInfo> userInfo = LiveData(UserInfo("jack", "123"));

void setUserInfo(UserInfo info) {
  // 更新数据
  userInfo.setValue(info);
}

void observer(UserInfo info) {
  if (kDebugMode) {
    print("name=${info.name} & account= ${info.account}");
  }
}

void listenUserInfo() {
  // 直接获取
  userInfo.getValue();
  // 监听变化 lifecycleOwner 类型
  userInfo.listen(observer, lifecycleOwner: null);
}

void removeObserver() {
  // 手动移除
  userInfo.removeObserver(observer);
}

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

1 回复

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


在Flutter开发中,flutter_arch 是一个用于管理应用架构的插件,它可以帮助开发者更好地组织代码,实现关注点分离(Separation of Concerns, SoC)。虽然 flutter_arch 并不是一个官方广泛认知的插件(可能指的是某种特定的架构管理库或自定义库),但基于你的要求,我将展示一个使用 Flutter 中常见的架构模式(如 MVVM 或 Clean Architecture)的代码示例,这些模式可以通过一些常见的库和自定义代码来实现。

以下是一个使用 Flutter 和 Provider(一个流行的状态管理库)来模拟类似 flutter_arch 功能的简单示例,实现一个基本的数据流管理。

1. 创建 Flutter 项目

首先,确保你已经安装了 Flutter 并创建了一个新的 Flutter 项目:

flutter create my_flutter_arch_app
cd my_flutter_arch_app

2. 添加 Provider 依赖

pubspec.yaml 文件中添加 provider 依赖:

dependencies:
  flutter:
    sdk: flutter
  provider: ^6.0.0  # 确保使用最新版本

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

3. 创建 Model

lib 目录下创建一个 models 文件夹,并在其中创建一个 user_model.dart 文件:

// lib/models/user_model.dart
class User {
  final String name;
  final int age;

  User({required this.name, required this.age});
}

4. 创建 Repository

lib 目录下创建一个 repositories 文件夹,并在其中创建一个 user_repository.dart 文件:

// lib/repositories/user_repository.dart
import 'package:my_flutter_arch_app/models/user_model.dart';

class UserRepository {
  // 模拟获取用户数据
  Future<User> fetchUser() async {
    return Future.delayed(Duration(seconds: 1), () => User(name: 'Alice', age: 30));
  }
}

5. 创建 ViewModel

lib 目录下创建一个 viewmodels 文件夹,并在其中创建一个 user_viewmodel.dart 文件:

// lib/viewmodels/user_viewmodel.dart
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:my_flutter_arch_app/models/user_model.dart';
import 'package:my_flutter_arch_app/repositories/user_repository.dart';

final userViewModelProvider = StateNotifierProvider<UserViewModel, User?>((ref) {
  final repository = UserRepository();
  return UserViewModel(repository);
});

class UserViewModel extends StateNotifier<User?> {
  final UserRepository repository;

  UserViewModel(this.repository) : super(null) {
    fetchUser();
  }

  void fetchUser() async {
    state = await repository.fetchUser();
  }
}

注意:这里使用了 flutter_riverpod 作为状态管理库,它是 Provider 的一个更现代、更强大的版本。如果你更倾向于使用 provider,可以相应地调整代码。

6. 创建 UI 组件

lib 目录下的 main.dart 文件中创建 UI 组件:

// lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:my_flutter_arch_app/viewmodels/user_viewmodel.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: UserScreen(),
    );
  }
}

class UserScreen extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final user = ref.watch(userViewModelProvider);

    return Scaffold(
      appBar: AppBar(
        title: Text('User Info'),
      ),
      body: Center(
        child: user == null
            ? CircularProgressIndicator()
            : Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text('Name: ${user!.name}'),
                  Text('Age: ${user!.age}'),
                ],
              ),
      ),
    );
  }
}

7. 运行应用

确保一切设置正确后,运行应用:

flutter run

这个示例展示了如何使用 Provider(或 Riverpod)和自定义的 ViewModel 来管理 Flutter 应用中的状态和数据流,从而实现了类似 flutter_arch 插件的功能。当然,根据项目的复杂性和需求,你可能需要更复杂的架构和更多的库来实现完整的功能。

回到顶部