#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. В то время, когда я комментировал пример кода, он не предоставил свой реальный код.