小编use*_*281的帖子

flutter - 通过状态(提供者/消费者)更新 TextField/TextEditingController

我在“页面”上有一个 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)

但这似乎不起作用。

似乎这个“非纯”小部件(因为控制器以编程方式处理)在想要重绘小部件的消费者模型中并不漂亮。

有人有什么想法吗?

谢谢!

dart flutter

6
推荐指数
1
解决办法
9200
查看次数

将数据传递给 Flutter 路由的 2 种方式之间的区别

我正在查看 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 使用目标小部件的构造函数来接收数据。我错过了什么吗?我什么时候会使用一个和另一个?

谢谢!

dart flutter

5
推荐指数
1
解决办法
500
查看次数

Flutter - 如何更新用于构建 ListView 的 Future/List 的状态(或值?)(通过 FutureBuilder)

我在下面粘贴了相关代码,但您也许可以根据我的伪解释来回答。

我使用 FutureBuilder 来构建列表视图。

  • 我首先使用 init() 异步 HTTP 调用 API,并将其解析为映射以表示 json 结果的对象列表(位置)。
  • 然后,该位置列表将返回到Future<List<Location>> _listFuture变量中(这是 FutureBuilder 的未来)。
  • 一旦 future“返回”或“完成”,FutureBuilder 就会启动并使用 ListView.builder/Container/ListTile 循环并构建列表。
  • 在某些时候,我需要一个 onTap() 处理程序(在 ListTile 中)来更改所选列表项的背景颜色。
  • 为了支持这一点,我在 Location 类(保存 JSON 响应)中有一个 backgroundColor 成员,对于所有项目,我默认为“#fc7303”(假设所有内容最初始终处于未选中状态)。然后我想将 onTap() 中选择的任何内容的背景更改为“#34bdeb”。
  • 我假设我可以调用 setState() ,这将触发刷新,并且新的背景颜色将在重绘时被注意到/使用。

问题是 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)

listview dart flutter flutter-layout flutter-futurebuilder

5
推荐指数
1
解决办法
2万
查看次数

是否可以忽略缺失的 NPM(对等)依赖项?

尝试着玩弄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)

npm reactjs

5
推荐指数
1
解决办法
1万
查看次数