首页 > 解决方案 > 尝试从 dart mixin 调用类构造函数时,错误 T 不是函数

问题描述

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

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 的类的构造函数(甚至其他静态方法)(从静态方法)?

标签: flutterdart

解决方案


如果您的目标只是避免为 using 编写样板文件Navigator.push()
那么有两种方法可以完成此操作。

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

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

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

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


推荐阅读