【问题标题】:Use of Double dot (..) operator / cascading in ChangeNotifierProvider在 ChangeNotifierProvider 中使用双点 (..) 运算符/级联
【发布时间】:2020-08-24 06:11:33
【问题描述】:
ChangeNotifierProvider(
  builder: (context) => AppStateModel()..loadBrands(),
  child: MyTestApp(),
)

为什么我们必须这样称呼AppStateModel()..loadBrands(),级联对我们有什么帮助?

【问题讨论】:

    标签: flutter dart cascading flutter-change-notifier


    【解决方案1】:

    级联符号 (..)

    级联 (..) 允许您对同一对象进行一系列操作。除了函数调用之外,您还可以访问同一对象上的字段。这通常会为您省去创建临时变量的步骤,并允许您编写更流畅的代码。

    例如,在您的情况下,您可以使用Cascade operator like:

    //call the method of app state class without creating a variable to hold an instance of the class
     AppStateModel()..loadBrands();
    

    而不是创建像这样的变量:

    //create an object of appstate and store in a variable
    AppStateModel appState;
    //access the methods of appstate class
    appSate.localBrands();
    

    要了解更多关于 Cascade Operator 的信息,请查看以下链接: Cascade Operators

    我希望这会有所帮助。

    【讨论】:

    • 这里的解释是您可以在不创建变量来保存类实例的情况下调用该方法,这引出了为什么要创建变量的问题,而这个答案从未解释过这个原因。更好的答案来自 Suragch,他解释说级联很有价值,不仅可以发送额外的消息,还可以从方法返回不同于通常返回值的东西。
    【解决方案2】:

    ChangeNotifierProviderbuilder(现在称为create)需要返回更改通知程序类的实例,在本例中为AppStateModel。通常你会这样做:

    create: (context) => AppStateModel(),
    

    但是,有时您还想在第一次创建类时运行一些方法,在本例中是 loadBrands 方法。如果您尝试使用这样的单个点来执行此操作:

    create: (context) => AppStateModel().loadBrands(),
    

    它确实会调用loadBrands 方法,但它也会给ChangeNotifierProvider 提供loadBrands 方法的返回值,这可能是voidFuture<void>,而不是ChangeNotifierProvider 需要的.

    另一方面,使用.. 双点运算符返回AppStateModel 本身,同时仍调用loadBrands 方法:

    create: (context) => AppStateModel()..loadBrands(),
    

    这是等价的:

    create: (context) {
      final model = AppStateModel();
      model.loadBrands();
      return model;
    },
    

    我有时发现.. 运算符难以阅读。只需使用对您有意义的表单即可。

    【讨论】:

    • .. 符号改变返回值的想法是这里的见解。谢谢!
    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多