写一个mvvm demo
时间: 2024-01-20 13:04:26 浏览: 63
好的,下面是一个简单的MVVM Demo示例,主要实现了数据绑定和视图模型。
首先,我们需要创建一个模型类和视图模型类。
模型类:
```
class User {
String name;
int age;
User(this.name, this.age);
}
```
视图模型类:
```
import 'package:flutter/material.dart';
import 'user.dart';
class UserViewModel extends ChangeNotifier {
User _user;
UserViewModel(User user) {
_user = user;
}
String get name => _user.name;
set name(String value) {
_user.name = value;
notifyListeners();
}
int get age => _user.age;
set age(int value) {
_user.age = value;
notifyListeners();
}
}
```
在视图上,我们可以将数据绑定到`UserViewModel`,
```
import 'package:flutter/material.dart';
import 'package:mvvm_demo/user.dart';
import 'package:mvvm_demo/user_view_model.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'MVVM Demo',
home: ChangeNotifierProvider<UserViewModel>(
create: (context) => UserViewModel(User('User Name', 20)),
child: HomePage(),
),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final userViewModel = Provider.of<UserViewModel>(context);
return Scaffold(
appBar: AppBar(
title: Text('MVVM Demo Home'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
margin: EdgeInsets.all(16.0),
child: TextField(
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'Name',
),
onChanged: (value) {
userViewModel.name = value;
},
),
),
Container(
margin: EdgeInsets.all(16.0),
child: TextField(
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'Age',
),
onChanged: (value) {
userViewModel.age = int.parse(value);
},
),
),
Container(
margin: EdgeInsets.all(16.0),
child: Text(
'User Name: ${userViewModel.name} \nUser Age: ${userViewModel.age}'),
),
],
),
);
}
}
```
在这个示例中,我们使用`provider`库来管理视图模型的状态,当视图模型中的数据发生变化时,我们可以通过`notifyListeners()`方法通知视图重新渲染。
希望这个简单的MVVM Demo示例对你有所帮助。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)