Ну, я думаю, может быть, вам было бы полезно изучить объектно-ориентированное программирование, дротик и то, как работает Flutter. Сначала мне нужно сказать вам, что вы просто не можете делать то, что пытаетесь сделать, вставлять виджеты в классы с отдельными функциями и пытаться создать их экземпляр в рамках Stateful.
Виджеты не должны создаваться, и если вы хотите что-то разбить на компоненты, вы должны сделать это с помощью класса с сохранением состояния или без состояния, а не с помощью обычного класса.
Ваш класс Mod должен выглядеть следующим образом:
class ChoosePic extends StatefulWidget {
ChoosePic({Key key}) : super(key: key);
@override
_ChoosePicState createState() => _ChoosePicState();
}
class _ChoosePicState extends State<ChoosePic> {
List<dynamic> img = List();
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(top: 20, right: 20, left: 20),
padding: EdgeInsets.only(top: 20.0),
width: double.infinity,
height: 150.0,
color: Colors.white70,
child: Center(
child: Row(
//mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
OutlineButton(
onPressed: () async {
File images1accom =
await ImagePicker.pickImage(source: ImageSource.gallery);
img.add(images1accom);
setState(() {});
},
child: Row(children: <Widget>[
Icon(Icons.camera_alt),
Text(
"Choose File",
style: TextStyle(fontSize: 12.0),
textAlign: TextAlign.end,
)
]),
borderSide: BorderSide(color: Colors.pink),
textColor: Colors.pinkAccent,
padding: EdgeInsets.all(10.0),
shape: new RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(10.0),
)),
Expanded(
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: img.length,
itemBuilder: (BuildContext c, int position) {
return (Image.file(
img[position],
fit: BoxFit.cover,
repeat: ImageRepeat.noRepeat,
));
},
),
),
],
),
),
);
}
}
И вы можете используйте его с
child: ChoosePic()
Я понятия не имею, почему вы используете список в своем основном классе, но если это действительно необходимо, вы бы сделали это:
ListView(children: <Widget>[
ChoosePic(),
])
Если вы хотите значение img, для этого вам понадобится менеджер состояний:
Используя Get (добавьте этот пакет в pubspe c): https://pub.dev/packages/get
Create класс с общим состоянием:
class Controller extends GetController {
static Controller get to => Get.find();
List<dynamic> img = List();
takeImage() {
File images1accom =
await ImagePicker.pickImage(source: ImageSource.gallery);
img.add(images1accom);
update(this);
}
}
// use it:
class ChoosePic extends StatefulWidget {
ChoosePic({Key key}) : super(key: key);
@override
_ChoosePicState createState() => _ChoosePicState();
}
class _ChoosePicState extends State<ChoosePic> {
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(top: 20, right: 20, left: 20),
padding: EdgeInsets.only(top: 20.0),
width: double.infinity,
height: 150.0,
color: Colors.white70,
child: Center(
child: Row(
//mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
OutlineButton(
onPressed: () async {
Controller.to.takeImage();
},
child: Row(children: <Widget>[
Icon(Icons.camera_alt),
Text(
"Choose File",
style: TextStyle(fontSize: 12.0),
textAlign: TextAlign.end,
)
]),
borderSide: BorderSide(color: Colors.pink),
textColor: Colors.pinkAccent,
padding: EdgeInsets.all(10.0),
shape: new RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(10.0),
)),
Expanded(
child: GetBuilder<Controller>(
init: Controller(),
builder: (controller) {
return ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: controller.img.length,
itemBuilder: (BuildContext c, int position) {
return (Image.file(
controller.img[position],
fit: BoxFit.cover,
repeat: ImageRepeat.noRepeat,
));
},
);
}
),
),
],
),
),
);
}
}
Теперь вы можете получить список изображений из любого места вашего кода с помощью:
на виджете 3 controller.img;
GetBuilder<Controller>(
init: Controller(),
builder: (controller) {
Пример:
GetBuilder<Controller>(
init: Controller(),
builder: (controller) {
return ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: controller.img.length,
itemBuilder: (BuildContext c, int position) {
return (Image.file(
controller.img[position],
fit: BoxFit.cover,
repeat: ImageRepeat.noRepeat,
));
},
);
И вынуть его из дерева виджетов w ith:
Controller.to.img
Примечание: init: Controller()
можно использовать только один раз, если вам нужен GetBuilder где-то еще, не используйте его. Используйте, например:
GetBuilder<Controller>(
builder: (controller) {
return ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: controller.img.length,
itemBuilder: (BuildContext c, int position) {
return (Image.file(
controller.img[position],
fit: BoxFit.cover,
repeat: ImageRepeat.noRepeat,
));
},
);
Что ж, я не должен отвечать на этот вопрос, так как это квалифицируется как общий вопрос, но поскольку вы новичок, я ответил, чтобы помочь вам подробно. Я надеюсь, что вы скоро поймете основы и когда-нибудь станете отличным разработчиком. Добро пожаловать во Flutter!