Flutter项目中以MVVM形式模拟登录页登录过程

在Flutter项目中,即使不使用Provider,也可以通过其他方法实现MVVM架构中的页面数据管理和前后端分离。下面以一个简单的登录页面作为示例,其中ViewModel负责处理业务逻辑,而View负责展示UI及与用户的交互。

创建一个用户Model,首先,定义一个User模型

class User {
  String username; // 用户登录账号
  String password; // 登录密码

  User({required this.username, required this.password});
}

接着创建一个名为 LoginViewModel 的 ViewModel,它将包含登录的业务逻辑,比如验证用户名和密码。

class LoginViewModel {
  String? _username; // 用户登录账户
  String? _password; // 用户登录密码
  bool _isFormValid = false; // 请求接口前判断登录账户和登录密码不能为空

  String? get username => _username;
  String? get password => _password;
  bool get isFormValid => _isFormValid;

  void updateUsername(String value) {
    _username = value;
    _updateFormValidity();
  }

  void updatePassword(String value) {
    _password = value;
    _updateFormValidity();
  }

  void _updateFormValidity() {
    _isFormValid = _username != null && _username!.isNotEmpty && _password != null && _password!.isNotEmpty;
  }

  Future<void> submitLogin() async {
    // 这里可以添加网络请求逻辑,模拟则直接打印
    if (_isFormValid) {
      print('Logging in with username: $_username and password: $_password');
    } else {
      print('Form is not valid!');
    }
  }
}

最后,创建登录页面 (UI层)LoginPage,在这个页面中,我们直接使用ViewModel来控制UI的显示和响应用户的输入。

class LoginPage extends StatefulWidget {
  const LoginPage({Key? key}) : super(key: key);

  @override
  State<LoginPage> createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  final TextEditingController _usernameController = TextEditingController();
  final TextEditingController _passwordController = TextEditingController();
  late LoginViewModel _loginViewModel = LoginViewModel();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('登录页')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextField(
              controller: _usernameController,
              onChanged: (value) => _loginViewModel.updateUsername(value),
              decoration: InputDecoration(labelText: 'Username'),
            ),
            SizedBox(height: 16),
            TextField(
              controller: _passwordController,
              obscureText: true,
              onChanged: (value) => _loginViewModel.updatePassword(value),
              decoration: InputDecoration(labelText: 'Password'),
            ),
            SizedBox(height: 24),
            ElevatedButton(
              onPressed: _loginViewModel.isFormValid ? () async {
                _loginViewModel.submitLogin();
              } : null,
              child: Text('Login'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _usernameController.dispose();
    _passwordController.dispose();
    super.dispose();
  }
}

在这个登录例子中,ViewModel直接在页面(_LoginPageState)中创建和管理,没有使用Provider。用户输入通过 TextField 和 onChanged 回调传递给ViewModel进行处理,而登录按钮的可用性则直接根据ViewModel的 isFormValid,属性来决定。当点击登录按钮时,调用ViewModel中的 submitLogin 方法执行登录操作。

虽然这个方法直接在页面内部管理状态,随着应用复杂度增加,手动管理ViewModel的生命周期和状态共享可能会变得困难,这时引入Provider或其它状态管理库就会显得更加合适。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter 是谷歌开发的跨平台移动应用开发框架,它能够将 Dart 代码编译为本地平台的 ARM 代码,在 iOS 和 Android 平台上运行。Flutter 支持与原生代码混合使用,这使得开发人员可以使用 Flutter 开发 UI,同时使用原生代码处理一些高级功能。 如果你想将 Flutter 作为一个 aar 库嵌入到 Android 项目中,可以按照以下步骤: 1. 在 Flutter 项目中创建插件 Flutter 插件是一种将 Flutter 功能转换为原生代码的机制。插件包含了一个 Dart API 和一个原生 API,它们之间通过平台通道进行通信。要将 Flutter 项目作为 aar 库嵌入到 Android 项目中,你需要将 Flutter 插件创建为一个 aar 库。 你可以通过运行以下命令创建一个 Flutter 插件: ``` flutter create --template=plugin my_flutter_plugin ``` 这将创建一个名为 my_flutter_plugin 的插件,并在其中包含一个 Flutter 模块和一个 Android 模块。 2. 将 Flutter 插件打包为 aar 库 要将 Flutter 插件打包为 aar 库,你需要对 Android 模块进行一些修改。首先,将 Android 模块中的 build.gradle 文件中的 apply plugin 行更改为: ``` apply plugin: 'com.android.library' ``` 然后,将以下内容添加到 build.gradle 文件的末尾: ``` android { ... sourceSets { main.java.srcDirs += "${flutterRoot}/packages/flutter_module/src/main/java" } } task copyFlutterFramework(type: Copy) { from new File(project(':flutter').projectDir, 'build/app/outputs/flutter-apk/app-release-unsigned.apk') into('libs') { rename { 'app-release-unsigned.apk' } } } preBuild.dependsOn(copyFlutterFramework) ``` 这将允许你将 Flutter 模块中的 Dart 代码编译为本地平台的代码,并将其打包到 aar 文件中。 最后,在 Android 模块的 build.gradle 文件中添加以下依赖项: ``` dependencies { implementation 'com.google.android.material:material:1.0.0' implementation project(':flutter') } ``` 3. 将 aar 库添加到 Android 项目中 要将 aar 库添加到 Android 项目中,你需要将 aar 文件复制到 Android 项目的 libs 目录中,并将以下内容添加到 Android 项目的 build.gradle 文件中: ``` repositories { flatDir { dirs 'libs' } } dependencies { implementation(name:'my_flutter_plugin', ext:'aar') } ``` 这将允许 Android 项目在构建时引用 aar 库。 这些步骤将允许你将 Flutter 作为一个 aar 库嵌入到 Android 项目中。当你构建 Android 项目时,Flutter 将作为一个原生库被包含在内,可以通过平台通道与 Dart 代码进行通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值