Flutter „Future <void>” nie jest podtypem typu „Widget” [duplikat]
Nov 29 2020
Muszę wybrać obraz za pomocą MultiImagePicker, więc mam tę funkcję, która czeka na wybrany zasób, ale ta funkcja jest wywoływana po kliknięciu przycisku. Chcę wybrać zdjęcie, kiedy wchodzę na stronę bez klikania żadnego przycisku, czy to możliwe?
List<Asset> images = List<Asset>();
Future<void> loadAssets() async {
List<Asset> resultList = List<Asset>();
String error = '';
try {
resultList = await MultiImagePicker.pickImages(
maxImages: 300,
enableCamera: false,
selectedAssets: images,
);
} on Exception catch (e) {
error = e.toString();
}
if (!mounted) return;
setState(() {
images = resultList;
});
}
@override
Widget build(BuildContext context) {
if(images.length == 0){
return MaterialApp(
home: Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text('Picker Example'),
backgroundColor: Colors.blueAccent
),
body:Container(
child: images.length > 0 ? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
child: Text("Select photo"),
onPressed: () => loadAssets(),
),
RaisedButton(
child: Text("Remove photo"),
onPressed: removeAssets,
),
RaisedButton(
child: Text("upload photo"),
onPressed: upload,
),
Expanded(
child: buildGridView(),
)
],
) :loadAssets();
)
);
Czy to możliwe ?
Odpowiedzi
1 ShriHari Nov 29 2020 at 20:18
Zadzwoń loadAssets()
w initState()
funkcji. Po wybraniu obrazy są zapisywane na images
liście. Więc rób, co chcesz.
Przykład zaczerpnięty z Dokumentów ,
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:multi_image_picker/multi_image_picker.dart';
void main() => runApp(new MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
List<Asset> images = List<Asset>();
String _error = 'No Error Dectected';
@override
void initState() {
super.initState();
loadAssets();
}
Widget buildGridView() {
return GridView.count(
crossAxisCount: 3,
children: List.generate(images.length, (index) {
Asset asset = images[index];
return AssetThumb(
asset: asset,
width: 300,
height: 300,
);
}),
);
}
Future<void> loadAssets() async {
List<Asset> resultList = List<Asset>();
String error = 'No Error Dectected';
try {
resultList = await MultiImagePicker.pickImages(
maxImages: 300,
enableCamera: true,
selectedAssets: images,
cupertinoOptions: CupertinoOptions(takePhotoIcon: "chat"),
materialOptions: MaterialOptions(
actionBarColor: "#abcdef",
actionBarTitle: "Example App",
allViewTitle: "All Photos",
useDetailsView: false,
selectCircleStrokeColor: "#000000",
),
);
} on Exception catch (e) {
error = e.toString();
}
// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) return;
setState(() {
images = resultList;
_error = error;
});
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new Scaffold(
appBar: new AppBar(
title: const Text('Plugin example app'),
),
body: Column(
children: <Widget>[
Center(child: Text('Error: $_error')),
Expanded(
child: images.length > 0 ? buildGridView() : Center(child: Text("No Images")),
)
],
),
),
);
}
}