Значения доступа в flutter

#flutter #dart

Вопрос:

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

Это экран.дротик с переменной «Список точек». Я хочу использовать его дома.дротик.

 class Draw extends StatefulWidget {
  const Draw({Key? key}) : super(key: key);

  @override
  _DrawState createState() => _DrawState();
}

class _DrawState extends State<Draw> {
  List points = [];
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onPanUpdate: (DragUpdateDetails details) {
        Offset localPos = details.localPosition;
        setState(() {
          if (localPos.dx >= 0 amp;amp;
              localPos.dx <= MediaQuery.of(context).size.width * 0.8 amp;amp;
              localPos.dy >= 0 amp;amp;
              localPos.dy <= MediaQuery.of(context).size.height * 0.5)
            points.add(localPos);
          else {
            points.add(null);
          }
        });
      },
      onPanEnd: (DragEndDetails details) {
        points.add(null);
      },
      child: CustomPaint(
        painter: Painter(points: points),
      ),
    );
  }
}
...rest of code
 

Это мой дом.дарт

 class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        backgroundColor: Colors.yellowAccent,
        onPressed: () {
          setState(() {
            
          });
        },
        child: Icon(
          Icons.restore_page,
          color: Colors.black,
        ),
      ),
      backgroundColor: Colors.grey[300],
      appBar: AppBar(
        backgroundColor: Colors.yellowAccent,
        title: Text(
          "Digit Recognizer",
          style: TextStyle(color: Colors.black),
        ),
        centerTitle: true,
      ),
      body: Center(
        child: Column(
          children: [
            SizedBox(
              height: 15,
            ),
            Container(
              height: MediaQuery.of(context).size.height * 0.5,
              width: MediaQuery.of(context).size.width * 0.8,
              decoration: BoxDecoration(
                  color: Colors.white, border: Border.all(color: Colors.black)),
              child: Draw(),
            ),
...rest of code
 

Я хочу получить доступ к «точкам» с экрана.переменная dart внутри функции FloatingActionButton при нажатии() в home.dart.

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

1. Не могли бы вы показать, как вы перемещаетесь между 2 виджетами? Пожалуйста, предоставьте некоторый код, чтобы мы могли узнать о том, как вы ориентируетесь и является ли переменная статической или динамической

2. если вы новичок в flutter, пожалуйста, посмотрите это видео ==> > youtu.be/l3KnuUmlr-w . Это развеет все ваши сомнения.

3. Можете ли вы предоставить какой-нибудь код?

4. @SiddharthAgrawal Я добавил код.

5. @UrDistraction вот код.

Ответ №1:

Вы можете поместить оба этих виджета в один и тот же файл, а затем создать точки в виде глобальной переменной, поэтому

 List points = [];

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        backgroundColor: Colors.yellowAccent,
        onPressed: () {
          setState(() {
            print(points);
          });
        },
        child: Icon(
          Icons.restore_page,
          color: Colors.black,
        ),
      ),
      backgroundColor: Colors.grey[300],
      appBar: AppBar(
        backgroundColor: Colors.yellowAccent,
        title: Text(
          "Digit Recognizer",
          style: TextStyle(color: Colors.black),
        ),
        centerTitle: true,
      ),
      body: Center(
        child: Column(
          children: [
            SizedBox(
              height: 15,
            ),
            Container(
              height: MediaQuery.of(context).size.height * 0.5,
              width: MediaQuery.of(context).size.width * 0.8,
              decoration: BoxDecoration(
                  color: Colors.white, border: Border.all(color: Colors.black)),
              child: Draw(),
            ),
...rest of code


class Draw extends StatefulWidget {
  const Draw({Key? key}) : super(key: key);

  @override
  _DrawState createState() => _DrawState();
}

class _DrawState extends State<Draw> {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onPanUpdate: (DragUpdateDetails details) {
        Offset localPos = details.localPosition;
        setState(() {
          if (localPos.dx >= 0 amp;amp;
              localPos.dx <= MediaQuery.of(context).size.width * 0.8 amp;amp;
              localPos.dy >= 0 amp;amp;
              localPos.dy <= MediaQuery.of(context).size.height * 0.5)
            points.add(localPos);
          else {
            points.add(null);
          }
        });
      },
      onPanEnd: (DragEndDetails details) {
        points.add(null);
      },
      child: CustomPaint(
        painter: Painter(points: points),
      ),
    );
  }
}
...rest of code
 

Обычно я бы даже не создавал другой идентификатор состояния для этого случая, но я предполагаю, что вы делаете это по какой-то другой причине. Создание глобальной переменной позволяет получить к ней доступ из любого места

Лучшим способом реализации первого ответа может быть следующий, но вам придется посмотреть, сработает ли он.

 class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  Widget drawWidget = Container();
   
  @override
  void initState(){
    super.initState();
    drawWidget = Draw();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        backgroundColor: Colors.yellowAccent,
        onPressed: () {
          setState(() {
            print(drawWidget.points);
          });
        },
        child: Icon(
          Icons.restore_page,
          color: Colors.black,
        ),
      ),
      backgroundColor: Colors.grey[300],
      appBar: AppBar(
        backgroundColor: Colors.yellowAccent,
        title: Text(
          "Digit Recognizer",
          style: TextStyle(color: Colors.black),
        ),
        centerTitle: true,
      ),
      body: Center(
        child: Column(
          children: [
            SizedBox(
              height: 15,
            ),
            Container(
              height: MediaQuery.of(context).size.height * 0.5,
              width: MediaQuery.of(context).size.width * 0.8,
              decoration: BoxDecoration(
                  color: Colors.white, border: Border.all(color: Colors.black)),
              child: drawWidget,
            ),
...rest of code
 

И в drawWidget

 class Draw extends StatefulWidget {
  const Draw({Key? key}) : super(key: key);
  List points = [];
  @override
  _DrawState createState() => _DrawState();
}

class _DrawState extends State<Draw> {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onPanUpdate: (DragUpdateDetails details) {
        Offset localPos = details.localPosition;
        setState(() {
          if (localPos.dx >= 0 amp;amp;
              localPos.dx <= MediaQuery.of(context).size.width * 0.8 amp;amp;
              localPos.dy >= 0 amp;amp;
              localPos.dy <= MediaQuery.of(context).size.height * 0.5)
            widget.points.add(localPos);
          else {
            widget.points.add(null);
          }
        });
      },
      onPanEnd: (DragEndDetails details) {
        widget.points.add(null);
      },
      child: CustomPaint(
        painter: Painter(points: widget.points),
      ),
    );
  }
}
...rest of code
 

Надеюсь, это поможет
Инструкция печати в каждом коде показывает, как получить доступ

Ответ №2:

 class stful1{
  //create state method
}
class stful1 extends state{
   //Widget build method
   //data is actual data you want to send
   Navigator.push(context,MaterialPageRoute((context)=>stful2(data)))
}


//stful2
class stful2{
  //accept data in constructor
  dataType data;
  stful2(this.data);
  //create state method
}
class stful2 extends state{
   //Widget build method
  //access like widget.data
}
 

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

1. Как вы можете видеть из кода, его реализация сильно отличается в том смысле, что он отображает виджет с отслеживанием состояния внутри другого

2. В то время, когда я комментировал пример кода, он не предоставил свой реальный код.