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);
  }
}