【问题标题】:Error T is not a function when trying to call class constructor from a dart mixin尝试从 dart mixin 调用类构造函数时,错误 T 不是函数
【发布时间】:2021-02-23 15:28:24
【问题描述】:

我目前有一个像这样的简单混合:

import 'package:flutter/material.dart';

mixin PageNav on StatefulWidget {
  pushPage(BuildContext context) {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => this)
    );
  }
}

这个 mixin 让我不必在每个“页面”的 StatefullWidget 中定义 pushPage 方法。所以它消除了以下样板:

class PageTwo extends StatefulWidget {
  static pushPage(BuildContext context) {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => PageTwo())
    );
  }
  @override
  _PageTwoState createState() => _PageTwoState();
}

请注意,该方法是静态的,并调用 StatefulWidget 构造函数。

因此 mixin 的使用方式如下(在用户可能导航到的任何其他页面或小部件上):

class PageOne extends StatefulWidget with PageNav {
  @override
  _PageOneState createState() => _PageOneState();
}

然后用户可以从其他地方导航到此页面:

                TextButton(
                  onPressed: () => PageOne().pushPage(context),
                  child: Text('Go to PageOne'),
                ),

这可行并且没问题,但如果我能做到这一点会更好,就像 PageTwo 示例一样,如下所示:

                TextButton(
                  onPressed: () => PageOne.pushPage(context),
                  child: Text('Go to PageOne'),
                ),

这里 pushPage 是一个静态成员,所以 mixin 定义需要改变...

我尝试了以下方法,但失败了:

import 'package:flutter/material.dart';

mixin PageNav<T> on StatefulWidget {
  static pushPage(BuildContext context) {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => T()) // Error: T isn't a function
    );
  }
}

那么我如何(从静态方法)访问应用了 mixin 的类的构造函数(甚至是其他静态方法)?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    如果您的目标只是避免编写使用 Navigator.push() 的样板,
    那么有两种方法可以完成这项工作。

    1. 您可以使用GetX 包,它具有简单的界面,如Get.to(() =&gt; Page2());(是的,没有BuildContext

    2. 您可以像下面这样在实用程序类中简单地创建一个static 方法并在不初始化类的情况下调用它:

    class PageNavigator {
      static pushPage(BuildContext context, Widget destination) {
        Navigator.push(
            context,
            MaterialPageRoute(builder: (_) => destination));
      }
    }
    

    像这样使用它:PageNavigator.pushPage(context, MainScreen())

    【讨论】:

    • 我不会使用整个包,例如 GetX,但第二种解决方案很棒。
    • 同意GetX 对此可能太过分了,但它也有其他出色的优点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多