【问题标题】:get data from rest api ti DropdownButtonFormField in flutter在flutter中从rest api ti DropdownButtonFormField获取数据
【发布时间】:2022-01-12 22:45:00
【问题描述】:

我尝试从我的 Api 获取数据并填写 DropdownButtonFormField 这些是我的代码,

import 'dart:convert';

import 'package:http/http.dart' as http;

var url = Uri.parse('https://api.myweb.com/api/getdata');
var token = Uri.parse('https://api.myweb.com/api/jwt');

class FetchData {
Future<List?> fetch() async {
  try {
  var resp = await http.get(url, headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer $token',
  });
  var resBody = await json.decode(resp.body);
  return resBody;
 } catch (error) { }}}

下拉列表小部件是

import 'package:flutter/material.dart';
import 'package:vin/services/get_api_data.dart';


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

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


class _CarModelDataState extends State<CarModelData> {
String selectedValue = "";
@override
Widget build(BuildContext context) {
return DropdownButtonFormField(
    decoration: InputDecoration(
      enabledBorder: OutlineInputBorder(
        borderSide: const BorderSide(color: Colors.blue, width: 2),
        borderRadius: BorderRadius.circular(20),
      ),
      border: OutlineInputBorder(
        borderSide: const BorderSide(color: Colors.blue, width: 2),
        borderRadius: BorderRadius.circular(20),
      ),
      filled: true,
      fillColor: Colors.red,
    ),
    value: selectedValue,
    icon: const Icon(Icons.flag),
    style: const TextStyle(color: Colors.blue, fontSize: 16),
    onChanged: (newValue) {
      setState(() {
        selectedValue = newValue!;
      });
    },
  **items: widget.dropdownData!
      .map(
        (e) => DropdownMenuItem<String>(
          value: e.toString(),
          child: Text(e),
        ),
      )
      .toList(),**
 }
}

&lt;del&gt;最后一行如何填写项目?????? &lt;del&gt;

更新

这是发送下拉数据的“View_vin”

import 'package:flutter/material.dart';

import 'data/car_model_from_url.dart';
import 'package:vin/services/get_api_data.dart';

class Viewvin extends StatelessWidget {
const Viewvin({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Scaffold(
  backgroundColor: (Colors.green),
  appBar: AppBar(
    title: const Center(
      child: Text(
        'my Text',
        style: TextStyle(fontWeight: FontWeight.w600),
      ),
    ),
  ),
body: Column(
    children: <Widget>[
      FutureBuilder<List<String>?>(
          future: FetchData().fetch(),
          builder: (context, snapshot) {
            if (snapshot.hasData &&
                snapshot.connectionState == ConnectionState.done) {
              print(snapshot.hasData &&
                  snapshot.connectionState == ConnectionState.done);
              return CarModelData(
                dropdownData: snapshot.data!,
              );
            }

            ///handle other cases
            return CircularProgressIndicator();
          })
    ],
  ),
 );
 }
 }

您可以在我的服务类和 wnat 中看到我的 fetch 以将数据添加到下拉列表我收到一个错误

参数类型“Future”不能分配给参数类型“List?”

我该如何解决?

更新 2

我在项目部分更新 CarModel 以及 Viewvin

当我在 Viewvin 上的 car 中添加 Requerd 需要将 car 作为 argoman 时,如何删除 requerd在 Viewvin 上不需要通过车到 vinWiew? 谢谢

【问题讨论】:

  • 你在用FutureBuilder 代替fetch() 吗?
  • 如果您获得数据表单 API 并将其显示到下拉列表中,请参考我的回答 here 希望对您有所帮助。

标签: flutter dart drop-down-menu


【解决方案1】:

不要在FutureBuilder内部调用SetState,它会从服务器重新获取数据。

将获取的List&lt;String&gt; 传递给CarModelData


class CarModelData extends StatefulWidget {
  const CarModelData({
    Key? key,
    required this.dropdownData,
  }) : super(key: key);

  final List<String> dropdownData;

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

class _CarModelDataState extends State<CarModelData> {
  String? selectedValue;
  @override
  Widget build(BuildContext context) {
    return DropdownButtonFormField<String?>(
      decoration: InputDecoration(
        hintText: "Select value",
        enabledBorder: OutlineInputBorder(
          borderSide: const BorderSide(color: Colors.blue, width: 2),
          borderRadius: BorderRadius.circular(20),
        ),
        border: OutlineInputBorder(
          borderSide: const BorderSide(color: Colors.blue, width: 2),
          borderRadius: BorderRadius.circular(20),
        ),
        filled: true,
        fillColor: Colors.red,
      ),
      value: selectedValue,
      icon: const Icon(Icons.flag),
      style: const TextStyle(color: Colors.blue, fontSize: 16),
      onChanged: (newValue) {
        setState(() {
          selectedValue = newValue;
        });
      },
      items: widget.dropdownData
          .map(
            (str) => DropdownMenuItem<String>(
              value: str,
              child: Text(str),
            ),
          )
          .toList(),
    );
  }
}

经过测试


class T extends StatelessWidget {
  const T({Key? key}) : super(key: key);

  Future<List<String>?> fetch() async {
    return await Future.delayed(
      const Duration(seconds: 3),
      () {
        return List.generate(4, (index) => "item $index");
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: Column(
        children: <Widget>[
          FutureBuilder<List<String>?>(
              future: fetch(),
              builder: (context, snapshot) {
                if (snapshot.hasData &&
                    snapshot.connectionState == ConnectionState.done) {
                  print(snapshot.hasData &&
                      snapshot.connectionState == ConnectionState.done);
                  return CarModelData(
                    dropdownData: snapshot.data!,
                  );
                }

                ///handle other cases
                return CircularProgressIndicator();
              })
        ],
      ),
    );
  }
}

【讨论】:

  • 当我添加 "final List? dropdownData ;"收到此错误“必须初始化所有最终变量,但 'dropdownData' 不是。尝试为该字段添加初始化程序”
  • 移除final因为你稍后会添加数据,
  • 谢谢,但我得到了一个黑色的视图,有可能知道是什么原因吗?
  • 通过打印 /debug 检查它是否包含数据,然后您可以通过 CarModelData
  • 谢谢,我更新了我的问题可能对我有帮助,我在将数据从 api 传递到下拉列表时出错,
猜你喜欢
  • 2019-08-26
  • 2021-10-02
  • 1970-01-01
  • 2022-01-21
  • 2021-02-03
  • 2020-08-03
  • 2020-08-17
  • 2021-07-20
  • 2021-06-27
相关资源
最近更新 更多