Я делаю приложение для флаттера. У меня есть виджет домашней страницы, который показывает две вещи
- код устройства;
температура
Сначала для них устанавливаются некоторые значения по умолчанию, но затем пользователь переходит с домашней страницы на новый маршрут, называют этот виджет сенсорным виджетом. На этой новой странице он в основном подключается к датчику. Этот датчик отправляет код устройства и температуру, и я могу показать его в виджете датчика.
Проблема возникает, когда я хочу показать эту новую информацию на главной странице. Я сделал кнопку, чтобы пользователь мог вернуться на домашнюю страницу, но я хочу, чтобы обновить домашнюю страницу, используя значения, которые есть в моем виджете датчика.
Я использую класс 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, так как я уже инициализировал его. Любая помощь? Спасибо