Flutter 如何在Flatter中从点击时的listview填充表单
我有一个表单小部件、一个列表小部件和一个“包装器”小部件,或者换句话说,一个父/容器小部件。因此,为了给小部件树一个概念,它是这样的Flutter 如何在Flatter中从点击时的listview填充表单,flutter,dart,rxdart,Flutter,Dart,Rxdart,我有一个表单小部件、一个列表小部件和一个“包装器”小部件,或者换句话说,一个父/容器小部件。因此,为了给小部件树一个概念,它是这样的 父/容器小部件 表单小部件 按钮小部件 列表小部件 请注意,表单、按钮和列表小部件都是父/容器小部件内部的同级。我想要做的是点击列表小部件中的列表项,并用从列表小部件传递的数据填充表单小部件 import 'package:andplus_flutter_7_gui/model/user.dart'; import 'package:flutter/mat
- 父/容器小部件
- 表单小部件
- 按钮小部件
- 列表小部件
import 'package:andplus_flutter_7_gui/model/user.dart';
import 'package:flutter/material.dart';
class CrudList extends StatefulWidget {
CrudList({Key key, this.users, this.onUserSelected}) : super(key: key);
final List<User> users;
final SelectUser onUserSelected;
_CrudListState createState() => _CrudListState();
}
class _CrudListState extends State<CrudList> {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.green,
child: ListView.builder(
itemCount: widget.users?.length ?? 0,
itemBuilder: (BuildContext context, int index) {
var user = widget.users[index];
return ListTile(
key: Key(index.toString()),
title: Center(
child: Text(
"${user.firstName} ${user.lastName}",
style: TextStyle(color: Colors.white),
),
),
onTap: () {
print("${widget.users[index]} $index");
widget.onUserSelected(widget.users[index]);
},
);
},
),
);
}
}
typedef void SelectUser(User user);
这是我的家长小部件
import 'package:andplus_flutter_7_gui/model/user.dart';
import 'package:andplus_flutter_7_gui/services/user_service.dart';
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';
import 'crud_form.dart';
import 'crud_list.dart';
class Crud extends StatefulWidget {
Crud({Key key, this.title}) : super(key: key);
final String title;
_CrudContainerState createState() => _CrudContainerState();
}
class _CrudContainerState extends State<Crud> {
List<User> users;
User user = User();
UserService userService;
@override
void initState() {
super.initState();
if (userService == null) {
userService = UserService(user);
}
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
userService.dispose();
}
@override
Widget build(BuildContext context) {
return Material(
child: Scaffold(
resizeToAvoidBottomPadding: false,
appBar: AppBar(
title: Text(widget.title),
),
body: Builder(
builder: (context) => Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
flex: 2,
child: StreamBuilder(
builder: (context, AsyncSnapshot<User> snapshot) {
return CrudForm(
user: snapshot.data,
onUserAdded: (user) {
userService.addUser(user);
},
);
},
stream: userService.userObservable,
),
),
Expanded(
child: Text("Future button widget"),
),
Expanded(
flex: 3,
child: StreamBuilder(
builder: (ctx, AsyncSnapshot<List<User>> snap) {
return CrudList(
onUserSelected: userService.userSelected,
users: snap.data,
);
},
stream: userService.usersObservable,
),
),
],
),
),
),
);
}
void onEditUser(User user) {
setState(() {
user = user;
});
}
}
import'package:andplus_flatter_7_gui/model/user.dart';
导入“package:andplus_flatter_7_gui/services/user_service.dart”;
进口“包装:颤振/材料.省道”;
导入“包:rxdart/rxdart.dart”;
导入“crud_form.dart”;
导入'crud_list.dart';
类Crud扩展了StatefulWidget{
Crud({Key-Key,this.title}):超级(Key:Key);
最后的字符串标题;
_CrudContainerState createState()=>_CrudContainerState();
}
类_CrudContainerState扩展状态{
列出用户名单;
User=User();
用户服务用户服务;
@凌驾
void initState(){
super.initState();
if(userService==null){
userService=userService(用户);
}
}
@凌驾
无效处置(){
//TODO:实现dispose
super.dispose();
dispose();
}
@凌驾
小部件构建(构建上下文){
退货(
孩子:脚手架(
resizeToAvoidBottomPadding:false,
appBar:appBar(
标题:文本(widget.title),
),
车身:建造商(
生成器:(上下文)=>列(
mainAxisSize:mainAxisSize.max,
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
扩大(
弹性:2,
孩子:StreamBuilder(
生成器:(上下文,异步快照){
返回积垢(
用户:snapshot.data,
onUserAdded:(用户){
userService.addUser(用户);
},
);
},
流:userService.userObservable,
),
),
扩大(
子:文本(“未来按钮小部件”),
),
扩大(
弹性:3,
孩子:StreamBuilder(
生成器:(ctx,异步快照快照){
返回积木器(
onUserSelected:userService.userSelected,
用户:snap.data,
);
},
流:userService.usersObservable,
),
),
],
),
),
),
);
}
void onEditUser(用户){
设置状态(){
用户=用户;
});
}
}
上面的小部件包装了我提到的三个小部件
以下是儿童小部件:
表格:
import'package:andplus_flatter_7_gui/model/user.dart';
进口“包装:颤振/材料.省道”;
类CrudForm扩展StatefulWidget{
CrudForm({Key-Key,this.onUserAdded,this.user}):super(Key:Key);
最终用户;
添加的最终无效函数(用户);
_CrudFormState createState()=>\u CrudFormState(用户:用户);
}
类_CrudFormState扩展状态{
_CrudFormState({this.user});
User=User();
var_key=GlobalKey();
@凌驾
小部件构建(构建上下文){
返回容器(
孩子:建筑工人(
生成器:(上下文)=>容器(
颜色:Colors.blueAccent[100],
孩子:表格(
键:_键,
孩子:填充(
填充:仅限常量边集(左:8.0),
子:列(
mainAxisSize:mainAxisSize.min,
mainAxisAlignment:mainAxisAlignment.start,
儿童:[
划船(
儿童:[
正文(
“名字”,
样式:TextStyle(字体大小:20),
),
扩大(
孩子:填充(
填充:常数边集全部(8.0),
子项:TextFormField(
initialValue:widget.user?.firstName==null||
widget.user.firstName.isEmpty
?user.firstName
:widget.user.firstName,
验证器:(值){
if(value.isEmpty){
返回“需要名字”;
}
返回null;
},
已保存:(值){
设置状态(){
user.firstName=值;
});
},
),
),
)
],
),
划船(
儿童:[
正文(
“姓氏”,
样式:TextStyle(字体大小:20),
),
扩大(
孩子:填充(
填充:常数边集全部(8.0),
子项:TextFormField(
验证器:(va)
import 'package:andplus_flutter_7_gui/model/user.dart';
import 'package:flutter/material.dart';
class CrudList extends StatefulWidget {
CrudList({Key key, this.users, this.onUserSelected}) : super(key: key);
final List<User> users;
final SelectUser onUserSelected;
_CrudListState createState() => _CrudListState();
}
class _CrudListState extends State<CrudList> {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.green,
child: ListView.builder(
itemCount: widget.users?.length ?? 0,
itemBuilder: (BuildContext context, int index) {
var user = widget.users[index];
return ListTile(
key: Key(index.toString()),
title: Center(
child: Text(
"${user.firstName} ${user.lastName}",
style: TextStyle(color: Colors.white),
),
),
onTap: () {
print("${widget.users[index]} $index");
widget.onUserSelected(widget.users[index]);
},
);
},
),
);
}
}
typedef void SelectUser(User user);
import 'package:andplus_flutter_7_gui/model/user.dart';
import 'package:rxdart/rxdart.dart';
class UserService {
User _editedUser = User();
List<User> _users = <User>[];
BehaviorSubject<User> _userSubject;
BehaviorSubject<List<User>> _usersSubject;
UserService(this._editedUser) {
_userSubject = BehaviorSubject<User>.seeded(_editedUser);
_usersSubject = BehaviorSubject<List<User>>.seeded(_users);
}
Observable<List<User>> get usersObservable => _usersSubject.stream;
Observable<User> get userObservable => _userSubject.stream;
addUser(User user) {
_users.add(user);
_usersSubject.add(_users);
}
dispose() {
_userSubject.close();
_usersSubject.close();
}
void userSelected(User user) {
_editedUser = user;
_userSubject.add(_editedUser);
}
}