flutter 让数据变成列表~

1、首先将json变成实体方便调用

contact_bean.dart
class ContactBean {
  int? id;
  String? firstName;
  String? lastName;
  String? phoneNumber;
  int? age;
  int? sex;
  String? address;

  ContactBean(
      {this.id,
        this.firstName,
        this.lastName,
        this.phoneNumber,
        this.age,
        this.sex,
        this.address});

  ContactBean.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    firstName = json['firstName'];
    lastName = json['lastName'];
    phoneNumber = json['phoneNumber'];
    age = json['age'];
    sex = json['sex'];
    address = json['address'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['firstName'] = this.firstName;
    data['lastName'] = this.lastName;
    data['phoneNumber'] = this.phoneNumber;
    data['age'] = this.age;
    data['sex'] = this.sex;
    data['address'] = this.address;
    return data;
  }
}

2、修改一下main_provider.dart让返回来的json变成实体

先贴完整代码:

main_provider.dart
import 'dart:convert';

import 'package:day03/bean/base_bean.dart';
import 'package:day03/bean/contact_bean.dart';
import 'package:day03/dio_util.dart';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';

class MainProvider with ChangeNotifier {
  String _text = '';

  String get text => _text;

  List<ContactBean> _dataList = [];
  List<ContactBean> get dataList => _dataList;

  void getList() async {
    await DioUtil.getInstance().get(
      "http://192.168.5.116:20080/contact/list",
      null,
      () {
        _text = "loading";
        notifyListeners();
      },
      (data) {
        BaseBean bean = BaseBean.fromJson(data);
        _dataList=List.from(bean.data.map((e) => ContactBean.fromJson(e)));
        notifyListeners();
      },
      (reason) {
        _text = reason;
        notifyListeners();
      },
    );
  }

  void addContact() async {
    DioUtil.getInstance().addHeader("token", "123456789");
    await DioUtil.getInstance().post(
      "http://192.168.5.116:20080/contact/add",
      {
        'firstName': '王',
        'lastName': '六',
        'phoneNumber': '13456789010',
        'age': '22',
        'sex': 1,
        'address': '山西省晋城市',
      },
      () {
        _text = "loading";
        notifyListeners();
      },
      (data) {
        _text = '添加成功';
        notifyListeners();
      },
      (reason) {
        _text = reason;
        notifyListeners();
      },
    );
  }
}

首先添加了个dataList的变量

  List<ContactBean> _dataList = []; //私有变量
  List<ContactBean> get dataList => _dataList; //对外引用只读

然后在getList()方法里将原来的:

_text = bean.data.toString();

换为:

 _dataList=List.from(bean.data.map((e) => ContactBean.fromJson(e)));

将数据更新从更新text文字变成dataList列表,然后使用map方法遍历出ContactBean

好了,数据怎么来解决了,接下来改UI

4、改UI!

main.dart
import 'package:day03/main_provider.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(
    MultiProvider(
      providers: [ChangeNotifierProvider(create: (context) => MainProvider())],
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  Widget build(BuildContext context) {
    final provider = Provider.of<MainProvider>(context);

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(provider.text),
            ElevatedButton(
              onPressed: provider.getList,
              child: const Text('请求数据'),
            ),
            ElevatedButton(
              onPressed: () => provider.addContact(),
              child: const Text('添加一个联系人'),
            ),
            Expanded(
              child: ListView.builder(
                itemCount: provider.dataList.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text('${provider.dataList[index].firstName} ${provider.dataList[index].lastName}'),
                    subtitle: Text('${provider.dataList[index].phoneNumber}'),
                  );
                },
              ),
            )
          ],
        ),
      ),
    );
  }
}

仍然是StatelessWidget,不过后面用Expanded撑开剩下的地方,往里面放了一个ListView,使用ListView.Builder构建。
itemCount指List的计数;itemBuilder内放置ListView item组件
为演示方便就返回一个ListTile用于展示数据,直接provider.dataList[index]引用列表里的ContactBean对象

上一篇
下一篇