gpt4 book ai didi

firebase - 在 Streambuilder 中使用 TextField

转载 作者:IT王子 更新时间:2023-10-29 06:36:36 28 4
gpt4 key购买 nike

我们如何在 StreamBuilder 中添加一个 TextField?我有一个 TextField/TextFormField 作为 StreamBuilder 或 FutureBuilder 的构建器函数内的小部件之一,每当我们尝试与文本字段交互时,它只会刷新整个构建器小部件并再次调用流/ future 。

body: StreamBuilder(
stream: getClientProfile().snapshots(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
print(snapshot.data.data);
Client tempClient = Client.from(snapshot.data);
print('details = ${tempClient.representative.email} ${tempClient
.address.location} ${tempClient.businessDescription}');
return Container(
child: Column(
children: <Widget>[
TextFormField(

)
],
),
);
} else if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
} else {
return Center(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Icon(Icons.error),
),
Text('Error loading data')
],
),
);
}
}),

和firestore功能

DocumentReference getClientProfile() {
return _firestore.collection(SELLERS_COLLECTION).document(_uid);
}

我想要实现的是拥有一个表单,其中包含来自 firestore 文档的预填充数据,基本上是一个编辑表单。有没有其他方法可以达到同样的效果,或者我在结构上做错了什么?

编辑:

建议修改后的代码。

    import 'package:flutter/material.dart';
import 'Utils/globalStore.dart';
import 'models/client_model.dart';
import 'dart:async';

class EditProfileInformation extends StatefulWidget {
@override
EditProfileInformationState createState() {
return new EditProfileInformationState();
}
}

class EditProfileInformationState extends State<EditProfileInformation> {
Stream dbCall;
final myController = TextEditingController();

@override
void initState() {
// TODO: implement initState
super.initState();
dbCall = getClientProfile().snapshots();
myController.addListener(_printLatestValue);
}

_printLatestValue() {
print("Second text field: ${myController.text}");
}

@override
void dispose() {
myController.removeListener(_printLatestValue);
myController.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
// key: _scaffoldKey,
appBar: AppBar(
title: Text(
'Edit profile',
style: TextStyle(),
),
),

body: StreamBuilder(
stream: dbCall,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
print(snapshot.data.data);
Client tempClient = Client.from(snapshot.data);
print('details = ${tempClient.representative.email} ${tempClient
.address.location} ${tempClient.businessDescription}');
return Container(
child: Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
controller: myController,
),
)
],
),
);
} else if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
} else {
return Center(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Icon(Icons.error),
),
Text('Error loading data')
],
),
);
}
}),
floatingActionButton: FloatingActionButton(
onPressed: () {

},
child: Icon(Icons.done),
),
);
}
}

最佳答案

为了正确使用 StreamBuilder,您必须确保您正在使用的流缓存在 State 对象上。虽然 StreamBuilder 可以正确处理从流中获取新事件,但接收全新的 Stream 将迫使它完全重建。在您的情况下,getClientProfile().snapshots() 将在调用时创建一个全新的 Stream,从而破坏文本字段的所有状态。

class Example extends StatefulWidget {
@override
State createState() => new ExampleState();
}

class ExampleState extends State<Example> {
Stream<SomeType> _stream;

@override
void initState() {
// Only create the stream once
_stream = _firestore.collection(collection).document(id);
super.initState();
}

@override
Widget build(BuildContext context) {
return new StreamBuilder(
stream: _stream,
builder: (context, snapshot) {
...

},
);
}
}

编辑:听起来还有其他问题我无法从您提供的代码片段中诊断出来。

关于firebase - 在 Streambuilder 中使用 TextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51571065/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com