您是否应该对ChangeNotifier使用“扩展”或“带有”关键字? -颤振

时间:2019-06-20 06:31:42

标签: flutter state

我已经看到了几个使用'extends'和'with'关键字扩展ChangeNotifier的模型的示例。我不确定有什么区别。

            <table class="table table-hover table-bordered results" style="color:white;">
               <thead>
                <tr>
                  <th>Contact #</th>
                  <th>Picture</th>
                  <th >Name / Surname</th>
                  <th >Address</th>
                 </tr>
                <tr class="warning no-result">
                  <td colspan="4"><i class="fa fa-warning"></i> No result</td>
                </tr>
              </thead>
              <tbody>
                  <?php   
                        $sqlb = "select * from debtors  ";
                        $resultb = $conn->query($sqlb);
                        while($rowb = $resultb->fetch_assoc()){
                        $id=$rowb['contact #']; 
                  ?>

                <tr a class="dropdown-item"  data-toggle="modal" data-target="#logoutModal" style="color:white;">
                  <td><?php echo $rowb['contact #']; ?></td>
                  <td><?php echo $rowb['lname']; ?></td>
                  <td><?php echo $rowb['fname']; ?></td>
                  <td><?php echo $rowb['address']; ?></td></a>
                </tr>
              <?php } ?>
              </tbody>
            </table>

          </div>

          <!-- Logout Modal-->
<span>      
      <div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
          <div class="modal-content">
            <div class="modal-header">
              <h5 class="modal-title" id="exampleModalLabel"></h5>
              <button class="close" type="button" data-dismiss="modal" aria-label="Close">
                <span aria-hidden="true">x</span>
              </button>
            </div>
            <div class="modal-body"><?php echo $rowb['lname']; ?>, <?php echo $rowb['fname']; ?><BR>
<?php echo $rowb['balance']; ?>
            </div>
            <div class="modal-footer">
              <button class="btn btn-secondary" type="button" data-dismiss="modal">Cancel</button>
              <a class="btn btn-info" href="admin_logout.php">Yes</a>
            </div>
          </div>
        </div>
      </div>
</span> 

两者之间有什么区别?我应该使用哪一个?

2 个答案:

答案 0 :(得分:4)

您可以使用extends(继承)或with(作为混合)。两种方式都可以让您访问notifyListeners()中的ChangeNotifier方法。

继承

扩展ChangeNotifier意味着ChangeNotifier是超类。

class MyModel extends ChangeNotifier {

  String someValue = 'Hello';

  void doSomething(String value) {
    someValue = value;
    notifyListeners();
  }
}

如果您的模型类已经在扩展另一个类,则无法扩展ChangeNotifier,因为Dart不允许多重继承。在这种情况下,您必须使用mixin。

Mixin

mixin允许您使用mixin类(即notifyListeners())的具体方法。

class MyModel with ChangeNotifier {

  String someValue = 'Hello';

  void doSomething(String value) {
    someValue = value;
    notifyListeners();
  }
}

因此,即使您的模型已经从另一个类扩展了,您仍然可以“混入” ChangeNotifier

class MyModel extends SomeOtherClass with ChangeNotifier {

  String someValue = 'Hello';

  void doSomething(String value) {
    someValue = value;
    notifyListeners();
  }
}

这里有一些关于mixin的好读物:

答案 1 :(得分:0)

extends用于继承一个类
with用于将类用作 mixin

请参阅此处以了解 mixin 继承力之间的区别:https://stackoverflow.com/a/860312/10471480

文档中提到ChangeNotifier

  

可以扩展或混合的类,该类使用VoidCallback提供通知以提供更改通知API。

因此,您既可以继承它,也可以将其用作mixin