【问题标题】:Unable to make a dynamic listview of scrolltype horizontal?无法使滚动类型的动态列表视图水平?
【发布时间】:2021-08-30 18:35:51
【问题描述】:

我正在制作一个带有列表视图项目的地图应用程序,现在我想制作一个列表视图数组以确保它是动态的而不是硬编码的。

我是 Flutter 小部件世界的新手。来自服务器的数据越多,应该添加的列表视图项越多。这是代码

import 'dart:async';
import 'package:donation_yoga/services/json_service.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
//import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:geolocator/geolocator.dart';

import 'AddData.dart';

//import 'package:provider/provider.dart';

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

class _MapState extends State<Map> {
  /* Getting Live Location */
  Completer<GoogleMapController> _controllerGoogleMap = Completer();
  GoogleMapController newGoogleMapController;

  Position currentPosition;
  var geoLocator = Geolocator();

  void locatePosition() async {
    Position position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.best);
    currentPosition = position;

    LatLng latLngPos = LatLng(position.latitude, position.longitude);

    CameraPosition cameraPosition =
        CameraPosition(target: latLngPos, zoom: 15.0);

    newGoogleMapController
        .animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
  }

  static final CameraPosition _kGooglePlex = CameraPosition(
    target: LatLng(37.42796133580664, -122.085749655962),
    zoom: 14.4746,
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: <Widget>[
          myLayoutWidget(),
          // _buildContainer(),
          _createForm(context),
          listWidget1(),
        ],
      ),
    );
  }

  Widget myLayoutWidget() {
    return Container(
      child: GoogleMap(
        mapType: MapType.normal,
        myLocationButtonEnabled: true,
        initialCameraPosition: _kGooglePlex,
        myLocationEnabled: true,
        zoomGesturesEnabled: true,
        zoomControlsEnabled: true,
        onMapCreated: (GoogleMapController controller) {
          _controllerGoogleMap.complete(controller);
          newGoogleMapController = controller;
          locatePosition();
        },
      ),
    );
  }
}

Widget listWidget1() {
  Centres centre;
  return ListView.builder(
      padding: const EdgeInsets.all(8),
      itemCount: centre.entries.length,
      itemBuilder: (BuildContext context, int index) {
        return _boxes(
          centre.entries[index],
          centre.latitudes[index],
          centre.longitudes[index],
          centre.centres[index],
        );
      });
}

Widget _boxes(String _image, double lat, double long, String restaurantName) {
  return GestureDetector(
    onTap: () {},
    child: Container(
      child: new FittedBox(
        child: Material(
            color: Colors.white,
            elevation: 14.0,
            borderRadius: BorderRadius.circular(24.0),
            shadowColor: Color(0x802196F3),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Container(
                  width: 180,
                  height: 200,
                  child: ClipRRect(
                    borderRadius: new BorderRadius.circular(24.0),
                    child: Image(
                      fit: BoxFit.fill,
                      image: NetworkImage(_image),
                    ),
                  ),
                ),
                Container(
                  child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: listWidget1(),
                  ),
                ),
              ],
            )),
      ),
    ),
  );
}

Widget _createForm(BuildContext context) {
  return Align(
    alignment: Alignment(-0.8, -0.08),
    child: TextButton(
        style: ButtonStyle(
            backgroundColor: MaterialStateProperty.all(Colors.white)),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => AddData()),
          );
        },
        child: Text("Create")),
  );
}

它在屏幕上什么都没有显示,当然除了我评论过的地图,这些地图正在工作但经过硬编码。


/*
Widget _buildContainer() {
  return Align(
    alignment: Alignment.bottomLeft,
    child: Container(
      margin: EdgeInsets.symmetric(vertical: 20.0),
      height: 150.0,
      child: ListView(
        scrollDirection: Axis.horizontal,
        children: <Widget>[
          SizedBox(width: 10.0),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: _boxes(
                "https://lh5.googleusercontent.com/p/AF1QipO3VPL9m-b355xWeg4MXmOQTauFAEkavSluTtJU=w225-h160-k-no",
                40.738380,
                -73.988426,
                Centres.first),
          ),
          SizedBox(width: 10.0),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: _boxes(
                "https://lh5.googleusercontent.com/p/AF1QipMKRN-1zTYMUVPrH-CcKzfTo6Nai7wdL7D8PMkt=w340-h160-k-no",
                40.761421,
                -73.981667,
                Centres.second),
          ),
          SizedBox(width: 10.0),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: _boxes(
                "https://images.unsplash.com/photo-1504940892017-d23b9053d5d4?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=60",
                40.732128,
                -73.999619,
                Centres.third),
          ),
        ],
      ),
    ),
  );
}


Widget myDetailsContainer1(String restaurantName) {
  return Column(
    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
    children: <Widget>[
      Padding(
        padding: const EdgeInsets.only(left: 8.0),
        child: Container(
            child: Text(
          restaurantName,
          style: TextStyle(
              color: Color(0xff6200ee),
              fontSize: 24.0,
              fontWeight: FontWeight.bold),
        )),
      ),
      SizedBox(height: 5.0),
      Container(
          child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          Container(
              child: Text(
            "4.1",
            style: TextStyle(
              color: Colors.black54,
              fontSize: 18.0,
            ),
          )),
          Container(
            child: Icon(
              FontAwesomeIcons.solidStar,
              color: Colors.amber,
              size: 15.0,
            ),
          ),
          Container(
            child: Icon(
              FontAwesomeIcons.solidStar,
              color: Colors.amber,
              size: 15.0,
            ),
          ),
          Container(
            child: Icon(
              FontAwesomeIcons.solidStar,
              color: Colors.amber,
              size: 15.0,
            ),
          ),
          Container(
            child: Icon(
              FontAwesomeIcons.solidStar,
              color: Colors.amber,
              size: 15.0,
            ),
          ),
          Container(
            child: Icon(
              FontAwesomeIcons.solidStarHalf,
              color: Colors.amber,
              size: 15.0,
            ),
          ),
          Container(
              child: Text(
            "(946)",
            style: TextStyle(
              color: Colors.black54,
              fontSize: 18.0,
            ),
          )),
        ],
      )),
      SizedBox(height: 5.0),
      Container(
          child: Text(
        "This is ",
        style: TextStyle(
          color: Colors.black54,
          fontSize: 18.0,
        ),
      )),
      SizedBox(height: 5.0),
      Container(
          child: Text(
        "Closed \u00B7 Opens 17:00 Thu",
        style: TextStyle(
            color: Colors.black54, fontSize: 18.0, fontWeight: FontWeight.bold),
      )),
    ],
  );
}
*/

这是我的 Centers 类,其中包含项目列表,这将来自稍后在 Flutter 中的 https 发送/接收请求。

class Centres {
  final List<String> entries = <String>['A', 'B', 'C'];
  final List<String> centres = [
    'first location',
    'second location',
    'third location'
  ];
  final List<double> latitudes = [40.732128, 40.732128, 40.732128];
  final List<double> longitudes = [-73.999619, -73.999619, -73.999619];
}

【问题讨论】:

    标签: flutter google-maps dart listview flutter-layout


    【解决方案1】:
    import 'dart:async';
    //import 'package:donation_yoga/services/json_service.dart';
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    //import 'package:font_awesome_flutter/font_awesome_flutter.dart';
    import 'package:google_maps_flutter/google_maps_flutter.dart';
    import 'package:geolocator/geolocator.dart';
    
    import 'AddData.dart';
    
    //import 'package:provider/provider.dart';
    
    class Map extends StatefulWidget {
      @override
      State<StatefulWidget> createState() => _MapState();
    }
    
    class _MapState extends State<Map> {
      /* Getting Live Location */
      Completer<GoogleMapController> _controllerGoogleMap = Completer();
      GoogleMapController newGoogleMapController;
    
      Position currentPosition;
      var geoLocator = Geolocator();
    
      void locatePosition() async {
        Position position = await Geolocator.getCurrentPosition(
            desiredAccuracy: LocationAccuracy.best);
        currentPosition = position;
    
        LatLng latLngPos = LatLng(position.latitude, position.longitude);
    
        CameraPosition cameraPosition =
            CameraPosition(target: latLngPos, zoom: 15.0);
    
        newGoogleMapController
            .animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
      }
    
      static final CameraPosition _kGooglePlex = CameraPosition(
        target: LatLng(37.42796133580664, -122.085749655962),
        zoom: 14.4746,
      );
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Stack(
            children: <Widget>[
              myLayoutWidget(),
              _createForm(context),
              
              _buildContainer(),
            ],
          ),
        );
      }
    
      Widget myLayoutWidget() {
        return Container(
          child: GoogleMap(
            mapType: MapType.normal,
            myLocationButtonEnabled: true,
            initialCameraPosition: _kGooglePlex,
            myLocationEnabled: true,
            zoomGesturesEnabled: true,
            zoomControlsEnabled: true,
            onMapCreated: (GoogleMapController controller) {
              _controllerGoogleMap.complete(controller);
              newGoogleMapController = controller;
              locatePosition();
            },
          ),
        );
      }
    }
    
    Widget _boxes(String _image, double lat, double long, String restaurantName) {
      return GestureDetector(
        onTap: () {},
        child: Container(
          child: new FittedBox(
            child: Material(
                color: Colors.white,
                elevation: 14.0,
                borderRadius: BorderRadius.circular(24.0),
                shadowColor: Color(0x802196F3),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: <Widget>[
                    Container(
                      width: 180,
                      height: 200,
                      child: ClipRRect(
                        borderRadius: new BorderRadius.circular(24.0),
                        child: Image(
                          fit: BoxFit.fill,
                          image: NetworkImage(_image),
                        ),
                      ),
                    ),
                    Container(
                      child: Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: _buildContainer(),
                      ),
                    ),
                  ],
                )),
          ),
        ),
      );
    }
    
    Widget _buildContainer() {
      final List<String> entries = <String>['A', 'B', 'C'];
      final List<String> centres = [
        'first location',
        'second location',
        'third location'
      ];
      final List<double> latitudes = [40.732128, 40.732128, 40.732128];
      final List<double> longitudes = [-73.999619, -73.999619, -73.999619];
      return Align(
        alignment: Alignment.bottomLeft,
        child: Container(
          margin: EdgeInsets.symmetric(vertical: 20.0),
          height: 150.0,
          child: ListView(
            scrollDirection: Axis.horizontal,
            children: centres.asMap().entries.map((element) {
              int index = element.key;
              return Column(children: [
                SizedBox(width: 10.0),
                Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: _boxes(
                      "https://lh5.googleusercontent.com/p/AF1QipO3VPL9m-b355xWeg4MXmOQTauFAEkavSluTtJU=w225-h160-k-no",
                      latitudes[index],
                      longitudes[index],
                      element.toString()),
                ),
              ]);
            }).toList(),
          ),
        ),
      );
    }
    
    Widget _createForm(BuildContext context) {
      return Align(
        alignment: Alignment(-0.8, -0.08),
        child: TextButton(
            style: ButtonStyle(
                backgroundColor: MaterialStateProperty.all(Colors.white)),
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => AddData()),
              );
            },
            child: Text("Create")),
      );
    }
    

    错误是堆栈溢出另请参阅:https://flutter.dev/docs/testing/errors

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-12
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2013-01-01
      相关资源
      最近更新 更多