Трепетание с использованием унаследованных виджетов с навигатором, возвращающим NoSuchMethodError - PullRequest
0 голосов
/ 02 сентября 2018

Я делаю приложение для флаттера. У меня есть виджет домашней страницы, который показывает две вещи - код устройства; температура Сначала для них устанавливаются некоторые значения по умолчанию, но затем пользователь переходит с домашней страницы на новый маршрут, называют этот виджет сенсорным виджетом. На этой новой странице он в основном подключается к датчику. Этот датчик отправляет код устройства и температуру, и я могу показать его в виджете датчика.

Проблема возникает, когда я хочу показать эту новую информацию на главной странице. Я сделал кнопку, чтобы пользователь мог вернуться на домашнюю страницу, но я хочу, чтобы обновить домашнюю страницу, используя значения, которые есть в моем виджете датчика.

Я использую класс InheritedWidget, чтобы это произошло, но я продолжаю получать пустую ошибку, когда пытаюсь получить доступ к переменным на домашней странице.

Ниже приведен унаследованный класс виджетов для этого.

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»: метод getCode для DeviceCode был вызван null.

Я не понимаю, почему это null, так как я уже инициализировал его. Любая помощь? Спасибо

1 Ответ

0 голосов
/ 03 сентября 2018

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

Класс Navigator обрабатывает маршрутизацию во Flutter и используется для получения результата от маршрута, который вы поместили в стек. Это делается в ожидании будущего, возвращаемого push ().

Например, чтобы запустить маршрут местоположения, который позволяет пользователю выбрать свое местоположение, вы можете сделать следующее:

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

И затем, внутри вашего маршрута местоположения, как только пользователь выбрал свое местоположение, вы можете вытолкнуть стопку с результатом:

Navigator.of(context).pop({"lat":43.821757,"long":-79.226392});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...