Не удалось получить данные класса виджетов с отслеживанием состояния в другом флаттере класса виджетов с отслеживанием состояния?

#flutter #dart #state

Вопрос:

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

 import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:geocoding/geocoding.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:geolocator/geolocator.dart';
import 'AddData.dart';

class MapsClass extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _MapState();
}

class _MapState extends State<MapsClass> {
  Position curLoc;                    **I want this**
  bool mapToggle = false;
  GoogleMapController mapController;
  List<Placemark> placemarks;
  double sliderVal = 0;
  String loca;
  String country;

  void initState() {
    super.initState();
    Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.best)
        .then((curL) => {
              setState(() {
                curLoc = curL;
                mapToggle = true;
                this.getAdd();
              }),
            });
  }

  getAdd() async {
    placemarks =
        await placemarkFromCoordinates(curLoc.latitude, curLoc.longitude);
    this.country = placemarks.first.country;
    this.loca = placemarks.first.locality;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: <Widget>[
          Container(
              child: mapToggle
                  ? GoogleMap(
                      initialCameraPosition: CameraPosition(
                          target: LatLng(curLoc.latitude, curLoc.longitude),
                          zoom: 15.0),
                      myLocationEnabled: true,
                      onMapCreated: onCreate,
                      mapType: MapType.normal,
                      compassEnabled: false,
                      zoomControlsEnabled: false,
                      zoomGesturesEnabled: true,
                    )
                  : Center(
                      child: Text(
                        'Getting Location Please Wait.....',
                        style: TextStyle(fontSize: 20.0),
                      ),
                    )),
          Positioned(
            bottom: 40,
            left: 10,
            child: FloatingActionButton(
              backgroundColor: Colors.green,
              child: const Icon(Icons.create),
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => AddData()),
                );
              },
            ),
          ),
          Align(
            alignment: Alignment.topCenter,
            child: SizedBox(
              width: 200.0,
              height: 120.0,
              child: Card(
                color: Colors.green,
                child: Center(
                  child: Text(
                    "You are at $loca, $country",
                    style: TextStyle(color: Colors.white),
                  ), //Text
                ), //Center
              ), //Card
            ),
          ),
          Positioned(
            bottom: 40,
            left: 70,
            child: Slider(
              activeColor: Colors.green,
              value: sliderVal,
              min: 0,
              max: 10.0,
              divisions: 2,
              label: sliderVal.round().toString(),
              onChanged: (double value) {
                setState(() {
                  sliderVal = value;
                });
              },
            ),
          ),
        ],
      ),
    );
  }

  void onCreate(GoogleMapController controller) {
    setState(() {
      mapController = controller;
    });
  }
}
 

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

 import 'package:donation_yoga/screens/maps.dart';
import 'package:donation_yoga/services/Submitform.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: AddData(),
  ));
}

class AddData extends StatefulWidget {
  @override
  _AddData createState() => _AddData();
}

class _AddData extends State<AddData> {
  final _formKey = GlobalKey<FormState>();

  final _user = DataPush();

  final ma = MapsClass();

  var position = ma.curLOC;     // THIS IS WHERE I CAN'T GET ANYTHING OR ANYWHERE in the Entire class**


  void initState() {
    super.initState();
    
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: Text('ADD YOUR CENTER')),
        body: Container(
            padding:
                const EdgeInsets.symmetric(vertical: 16.0, horizontal: 10.0),
            child: Builder(
                builder: (context) => Form(
                    key: _formKey,
                    child: Column(
                        crossAxisAlignment: CrossAxisAlignment.stretch,
                        children: [
                          TextFormField(
                            decoration:
                                InputDecoration(labelText: "Enter Text"),
                            validator: (value) {
                              if (value.isEmpty) {
                                return 'Please Enter Something !!!';
                              }
                              return null;
                            },
                            onSaved: (val) =>
                                setState(() => _user.firstName = val),
                          ),
                          Container(
                            padding: const EdgeInsets.fromLTRB(0, 50, 0, 20),
                            child: Text('Options'),
                          ),
                          CheckboxListTile(
                              title: const Text('Dry'),
                              value: _user.passions[DataPush.Dry],
                              onChanged: (val) {
                                setState(
                                    () => _user.passions[DataPush.Dry] = val);
                              }),
                          CheckboxListTile(
                              title: const Text('Spot'),
                              value: _user.passions[DataPush.Spot],
                              onChanged: (val) {
                                setState(
                                    () => _user.passions[DataPush.Spot] = val);
                              }),
                          CheckboxListTile(
                              title: const Text('Red'),
                              value: _user.passions[DataPush.Red],
                              onChanged: (val) {
                                setState(
                                    () => _user.passions[DataPush.Red] = val);
                              }),
                          CheckboxListTile(
                              title: const Text('Stretch'),
                              value: _user.passions[DataPush.Strech],
                              onChanged: (val) {
                                setState(() =>
                                    _user.passions[DataPush.Strech] = val);
                              }),
                          CheckboxListTile(
                              title: const Text('Thick'),
                              value: _user.passions[DataPush.Thick],
                              onChanged: (val) {
                                setState(
                                    () => _user.passions[DataPush.Thick] = val);
                              }),
                          Container(
                              padding: const EdgeInsets.symmetric(
                                  vertical: 16.0, horizontal: 16.0),
                              // ignore: deprecated_member_use
                              child: RaisedButton(
                                  onPressed: () {
                                    final form = _formKey.currentState;
                                    if (form.validate()) {
                                      form.save();
                                      _user.makePostRequest();
                                      _showDialog(context);
                                    }
                                  },
                                  child: Text('Save'))),
                        ])))));
  }

  _showDialog(BuildContext context) {
    Scaffold.of(context)
        // ignore: deprecated_member_use
        .showSnackBar(SnackBar(content: Text('Submitting form')));
  }
}
 

Ответ №1:

@artistAhmed вы неправильно передаете данные. Используйте конструкторы и передавайте данные, чтобы вы могли получить их на другом экране. Смотрите этот ресурс flutter doc для получения ноу-хау. Это определенно сработает. Дайте мне знать, если у вас возникнут еще какие-либо проблемы.

Отправка данных на новый экран

Комментарии:

1. Я создаю конструктор mate, смотрите мой конструктор DataPush(); он отлично работает и получает значения из класса DataPush, но конструктор MapsClass() не работает, переменные в этом классе не показывают, где я хочу их вызвать