我在“页面”上有一个 TextField。我有一个连接到它的 TextEditingController。我可以通过以下简单的方法成功设置 TextField 的值:
usernameController.text = '1234';
Run Code Online (Sandbox Code Playgroud)
但是,我需要能够从子页面更改此字段。用例是用户从应用程序内部注销的登录表单。当我返回登录页面时,我希望清除/删除用户名/密码。现在,这些值仍然存在(显示当前在 usernameController.text 中的任何内容)
总的来说,我通过 Provider 管理状态。我可以在我的应用程序的其他地方设置和检索/显示状态,没有问题。问题变成了控制器是通过 initState() 中的 dart 代码设置的。它不是重建的小部件的一部分。
我可以在消费者中设置 TextField 小部件。当子页面中的状态更新(通过调试打印语句确认)时,构建器被调用,但小部件本身不反映状态的新值(它仍然具有旧用户名,并且没有被清空)。
Consumer<myAppState>(
builder: (context, appState, child) {
print("in builder for consumer: ");
print(appState.username);
return Container(
width: 200,
child: TextField(
controller: usernameController,
onChanged: (value) => _saveUsername(value),
decoration: InputDecoration(
hintText: 'Username',
prefixIcon: Icon(Icons.account_circle),
),
));
}),
Run Code Online (Sandbox Code Playgroud)
我试过更换
usernameController.text = '1234';
Run Code Online (Sandbox Code Playgroud)
和:
usernameController.text = Provider.of<myAppState>(context, listen: true).username;
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。
似乎这个“非纯”小部件(因为控制器以编程方式处理)在想要重绘小部件的消费者模型中并不漂亮。
有人有什么想法吗?
谢谢!
我正在查看 flutter.dev 教程。我对他们的 2 篇文章感到有些困惑。
1)将数据发送到新屏幕 https://flutter.dev/docs/cookbook/navigation/passing-data
2)将参数传递给命名路由 https://flutter.dev/docs/cookbook/navigation/navigate-with-arguments
对我来说,他们或多或少都完成了同样的事情,但方式不同。似乎#1 使用 Navigator 的“arguments”参数传递数据,然后通过 ModalRoute.of(context).settings.arguments 将其拉出目标小部件。似乎 #2 使用目标小部件的构造函数来接收数据。我错过了什么吗?我什么时候会使用一个和另一个?
谢谢!
我在下面粘贴了相关代码,但您也许可以根据我的伪解释来回答。
我使用 FutureBuilder 来构建列表视图。
Future<List<Location>> _listFuture变量中(这是 FutureBuilder 的未来)。 问题是 ListView/Contrainer/ListTile 是由
Future<List<Location>>
Run Code Online (Sandbox Code Playgroud)
。我可以将“tapped”索引传递给我的 ontap 处理程序,但我不相信我可以让我的 _changeBackground() 只需更新所选索引的 backgroundColor 值并调用 setState() 因为您无法直接访问/更新这样的未来(我收到错误ERROR: The operator '[]' isn't defined for the class 'Future<List<Location>>'.)
我不确定我采取了正确的方法。在这种情况下,我想理论上我总是可以将“背景”颜色跟踪分离到一个新的单独列表中(在未来之外),并使用 onTap() 中的对齐索引以这种方式跟踪/引用它。
但是,我不确定这总是有效。将来,我可能需要实际更改将来返回的值/状态。例如,考虑一下我是否希望能够单击列表项并更新“companyName”。在这种情况下,我将直接更改未来存储的值。我想我可以从技术上将新名称发送到服务器并以这种方式完全刷新列表,但这似乎效率低下(如果他们决定“取消”而不保存更改怎么办?)。
任何帮助表示赞赏。谢谢!
这个类实际上保存了列表的相关数据
// Location
class Location {
// members
String locationID;
String …Run Code Online (Sandbox Code Playgroud) 尝试着玩弄reactjs,而我的熟悉程度却非常有限npm。
我跑:
npx create-react-app my-app
Installing template dependencies using npm...
npm WARN react-scripts@3.4.1 requires a peer of typescript@^3.2.1 but none is installed.
You must install peer dependencies yourself.
npm WARN sass-loader@8.0.2 requires a peer of node-sass@^4.0.0 but none is installed.
You must install peer dependencies yourself.
npm WARN sass-loader@8.0.2 requires a peer of sass@^1.3.0 but none is installed.
You must install peer dependencies yourself.
npm WARN sass-loader@8.0.2 requires a peer of fibers@>= 3.1.0 but none is …Run Code Online (Sandbox Code Playgroud)