jjzjj

flutter - 点击监听器中 flutter onTap() 和 javascript/jquery $(this) 的区别

coder 2023-07-22 原文

我仍在学习 dart/flutter。我正在试验 ListView/ListTile,特别是来自 ListTile 的 onTap()。

我对 JS/Jquery 比较熟悉,但很难理解 JS 和 Flutter 之间的方法差异。

请尽量忽略以下代码中的任何语义或技术错误。我更关心理论/方法,而不是这是一个格式完美且句法正确的示例。

在 JS 中,通常会执行一些操作,例如对 API 进行 AJAX 调用以从数据库中获取待售商品列表。假设 API 返回了 4 个字段(主键 ID、isAvailable、商品名称和商品价格)。然后处理列表并创建/插入 DOM 元素以供显示。

<div id="234" data-isavailable="y" class=".itemsForSale">TV: $800</div>
<div id="345" data-isavailable="y" class=".itemsForSale">Microwave: $200</div>
<div id="456" data-isavailable="n" class=".itemsForSale">Book: $30</div>
<div id="567" data-isavailable="y" class=".itemsForSale">Sofa: $450</div>

然后您可以任意设置监听器。例如,你可以做...

$( ".itemsForSale" ).click(function() {
   // do something
});

点击处理程序“实时”应用。执行的代码知道单击了什么,并可以分析/与列表中的该项目交互。所以,你可以这样做:

$( ".itemsForSale" ).click(function() {
    var isAvailable = $(this).attr('data-isavailable');
    if( isAvailable == 'n' )
      alert('sorry but that item is out of stock!');
    else
      addItemToCart( $(this).attr('id') );
});

重点是,点击处理程序不一定知道或关心每个项目的基础数据。它在运行时变得“上下文”感知,然后从 UI/等中提取相关值。

对于 flutter,我希望使用 ListView 和 ListTile 重新创建类似的功能。具体来说,ListTile 的 onTap()。我感到困惑,因为似乎所有内容都是“提前”编码的。

这是一个基本示例(暂时忽略我没有显示价格/等等)...

import 'package:flutter/material.dart';

class SecondScreen extends StatelessWidget {

  var mapper = {
    '234': 'TV',
    '345': 'Microwave',
    '456': 'Book',
    '567': 'Sofa'
  };

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Second Screen"),
        ),
        body:
            ListView.builder(  
              padding: const EdgeInsets.all(8.0),
              itemCount: mapper.length,
              itemBuilder: (BuildContext context, int index) {
                return ListTile(
                  key: new Key(mapper.keys.elementAt(index).toString()),
                  title: Text('${mapper.values.elementAt(index)}'),
                  onTap: () {
                    print('you clicked: ' + mapper.keys.elementAt(index).toString() );
                    addToShoppingCart( mapper.keys.elementAt(index).toString() ); // this doesnt exist yet and is just an example
                  } 
                );
              }
            )
    );
  }

}

首先,我什至不确定我是否需要为每个 ListView 项目分配一个自定义键(基于数据库的主键),但现在这无关紧要。

我遇到的问题是 onTap 处理程序似乎没有“$(this)”的等效项。 flutter 是否给每个 ViewTile 它是 onTap() 的“自己的”副本,并且每个相关的关键信息都“硬编码”到每个 ViewTile 中(对于每个 itemBuilder 循环, mapper.keys.elementAt(index).toString() 的当前值是替换为 onTap() )?

我可能没有正确描述我的困惑,我什至不确定我将遇到的所有问题。我确定我这样做的方式非常“陈旧”,并且与 React 和其他较新的方法/框架(在 UI 元素中组合数据)不一致。

我只是无法理解如何添加更复杂的逻辑(例如检查所点击内容的可用性)。

有没有人有任何引用资料或解释可以帮助我弥合这一差距?我什至不知道如何描述 $(this) 的概念以及与 flutter/etc 相比我将如何搜索它。我只知道感觉很不一样。

谢谢!

最佳答案

我理解您的困惑,可能是因为几个月前我刚开始使用 Flutter 时也遇到过类似的问题。这就是我的想法-

ListTile 项是否有它自己的 onTap() 副本并不重要。 A. 它没有自己的副本。 (下面的代码片段将解释)和 B. 每种编程语言/SDK/任何东西都有自己的工作方式。你想说的可能是你有一辆宝马。它有某种类型的休息。你正试图在奥迪中做出准确的突破。这样做可能不对,因为与休息相关的其他系统可能无法以优化的方式工作。

现在,看看下面的代码片段:

@override
  Widget build(BuildContext context) {
    return ListView.separated(
      separatorBuilder: (context, index) => ListViewDivider(),
      itemCount: faceRecTransactions.length,
      itemBuilder: (BuildContext context, int index) {
        return FacerecTransactionListItem(facerecTransaction: faceRecTransactions[index], onTap:()=> _onTap(faceRecTransactions[index],context),);
      },
    );

  }

  void _onTap(FacerecTransaction facerecTransaction, BuildContext context) {
    print('Status : ${facerecTransaction.userId}');
    Navigator.push(context, MaterialPageRoute(builder: (context) => FacerecDetailPage(
      facerecTransaction: facerecTransaction,
      criminalList: this.criminalList,)));

  }

每个列表项都没有 onTap 的副本。它只是“感觉”,因为我们在 ListView 中编写了 onTap。如果您查看上面的示例,当用户点击某个项目时,onTap 会收到信息。我们不会创建这样的 onTap 数组。

因为没有 onTaps 的副本,所以它不是真正的提前代码。它的工作方式与 Ajax 非常相似,其中 onTap 并不真正关心负载。它只执行指定的操作。

现在,在上面的示例中,详细页面可以检查特定项目的可用性。如果该项目不可用,则可以显示任何适当的消息。根据需要,我们可以在 onTap 中或在下一页中编写此代码。简而言之,onTap 可以根据需要处理复杂的逻辑。

关于flutter - 点击监听器中 flutter onTap() 和 javascript/jquery $(this) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57202810/

有关flutter - 点击监听器中 flutter onTap() 和 javascript/jquery $(this) 的区别的更多相关文章

  1. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  2. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  3. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  4. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  5. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

    转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

  6. ruby - 这两段代码有什么区别? - 2

    打印1:defsum(i)i=i+[2]end$x=[1]sum($x)print$x打印12:defsum(i)i.push(2)end$x=[1]sum($x)print$x后者是修改全局变量$x。为什么它在第二个例子中被修改而不是在第一个例子中?类Array的任何方法(不仅是push)都会发生这种情况吗? 最佳答案 变量范围在这里无关紧要。在第一段代码中,您仅使用赋值运算符=为变量i赋值,而在第二段代码中,您正在修改$x(也称为i)使用破坏性方法push。赋值从不修改任何对象。它只是提供一个名称来引用一个对象。方法要么是破坏性

  7. ruby - Ruby 中 .next 和 .succ 的区别 - 2

    Ruby中的Fixnum方法.next和.succ有什么区别?看起来它的工作原理是一样的:1.next=>21.succ=>2如果有什么不同,为什么有两种方法做同样的事情? 最佳答案 它们是等价的。Fixnum#succ只是Fixnum#next的同义词。他们甚至在thereferencemanual中共享同一block. 关于ruby-Ruby中.next和.succ的区别,我们在StackOverflow上找到一个类似的问题: https://stacko

  8. ruby - 在参数为 `yield self` 的方法中使用 `&block` 和在没有参数 `yield self` 的方法中使用 `&block` 有什么区别吗? - 2

    我明白了defa(&block)block.call(self)end和defa()yieldselfend导致相同的结果,如果我假设有这样一个blocka{}。我的问题是-因为我偶然发现了一些这样的代码,它是否有任何区别或者是否有任何优势(如果我不使用变量/引用block):defa(&block)yieldselfend这是一个我不理解&block用法的具体案例:defrule(code,name,&block)@rules=[]if@rules.nil?@rules 最佳答案 我能想到的唯一优点就是自省(introspecti

  9. jquery - 如何将 AJAX 变量从 jQuery 传递到他们的 Controller ? - 2

    我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam

  10. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

随机推荐