使用Navigator返回NoSuchMethodError,继承使用继承的小部件

问题描述 投票:0回答:1

我正在制作一个扑动的应用程序。我有一个主页小部件,显示两件事 - 设备代码;温度首先,这些设置为某些默认值,但用户然后从主页转到新路径,将此小部件称为传感器小部件。在这个新页面中,它基本上连接到传感器。该传感器发出设备代码和温度,我可以在传感器小部件中显示它。

当我想在主页上显示这些新信息时,问题就来了。我创建了一个用户可以返回主页的按钮,但我希​​望能够使用传感器小部件中的值更新主页。

我正在利用InheritedWidget类来实现这一点,但是当我尝试访问主页中的变量时,我一直收到null错误。

下面是继承的widget类。

class TemperatureContext extends InheritedWidget {
    final int _deviceCode;
    final double _temperature;

    int    get deviceCode => _deviceCode;
    double get temperature => _temperature;

    set deviceCode(int d) {_deviceCode = d;}
    set temperature(double t) {_temperature = t}

    TemperatureContext(this.deviceCode, this.temperature, {Key key, Widget child})
    .super(key: key, child:child)

    @override
    bool updateShouldNotify(Widget oldWidget) {
        return (temperature != oldWidget.temperature && deviceCode != oldWidget.deviceCode) }

    static TemperatureContext of(BuildContext context) {
        return context.inheritFromWidgetOfExactType(TemperatureContext) }
    }

然后我有了主页,new_widget是一个基于它构建小部件的函数

    class HomePage extends StatefulWidget {
      @override
      _HomePageState createState() => _HomePageState();
    }

    class _HomePageState extends State<HomePage> {

        static int deviceCode = 0;
        static double deviceCode = get_temp_globally();


        @override
        Widget build(BuildContext context) {
        final tempContext = TemperatureContext.of(context);
        Widget output = new MaterialApp(
            home: new Scaffold(
                appBar: new AppBar(
                title: new Text('Homepage'),
            ),
            body: new Column(
              children: <Widget>[
                new_widget(tempContext.deviceCode, tempContext.temperature),
                new FlatButton(
                    child: new Text('Set new sensor'),
                    onPressed: () {
                      Navigator.of(context).pushNamed('/ChangePage');
                    })
              ],
            )));
    return output;
  }

接下来是更改页面窗口小部件,用户在按下主页中的按钮时将被带到该窗口小部件

class SensorWidget extends StatefulWidget {
  SensorWidget({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _SensorWidgetState createState() => new _SensorWidgetState();

}

class _SensorWidgetState extends State<SensorWidget> {
  static int deviceCode  = 0;
  static double temperature  = get_temp_globally();

  /* Some code that gets the deviceCode,
  temperature and sets them to the above
  variables */

  @override
  Widget build(BuildContext context) {
    output = TemperatureContext(
      deviceCode,
      temperature,
      child: MaterialApp(
        home: new Scaffold(
          appBar: new AppBar(
            title: const Text('Sensor widget'),
            actions: _buildActionButtons(),
          ),
          floatingActionButton: _buildScanningButton(),
          body: new Container(
            child: new FlatButton(
              child: new Text("Go back"),
              onPressed: () {
              Navigator.of(context).pop(true);
              }
            ),
          ),

        ),
        ),
      );
      return output;
  }
}

这是我的main.dart文件

void main() {
  runApp(new MyApp());

}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Temperature detector',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new HomePage(),
      routes: <String, WidgetBuilder> {
        '/HomePage' : (BuildContext context) => new HomePage(),
        '/SensorWidget': (BuildContext context) => new SensorWidget(),
      },
    );
  }
}

基本上当我将new_widget函数放在我的HomePage类中时(我没有放在这里,但基本上是根据提供的两个参数构建一个小部件),我得到一个“NoSuchMethodError”:getter deviceCode在null上调用。

我不知道为什么这是空的,因为我已经初始化它。有帮助吗?谢谢

flutter
1个回答
0
投票

https://flutter.io/flutter-for-android/#what-is-the-equivalent-of-startactivityforresult

Navigator类处理Flutter中的路由,用于从您在堆栈上推送的路由返回结果。这是通过等待push()返回的Future来完成的。

例如,要启动允许用户选择其位置的位置路线,您可以执行以下操作:

Map coordinates = await Navigator.of(context).pushNamed('/location');

然后,在您的位置路线内,一旦用户选择了他们的位置,您就可以使用结果弹出堆栈:

Navigator.of(context).pop({"lat":43.821757,"long":-79.226392});
© www.soinside.com 2019 - 2024. All rights reserved.