dart 如何解决flutter问题

iklwldmw  于 2022-12-16  发布在  Flutter
关注(0)|答案(1)|浏览(206)

当我调试这个它显示在搜索栏上的错误,当我试图在模拟器上的文本这里是代码,请解决这个谢谢
延迟初始化错误:字段“name”尚未初始化。

import 'dart:async';
import 'dart:convert';

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

void main() => runApp(MyApp());

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String url = "https://owlbot.info/api/v4/dictionary/";
  String token = "7ba05536bd11ff8e22800cbda80951376c59ed84";
  TextEditingController textEditingController = TextEditingController();
  late StreamController _streamController;
 late Stream _stream;
 late Timer _debounce;

  searchText() async {
    if (textEditingController.text == null ||
        textEditingController.text.isEmpty) {
      _streamController.add(null);
      return;
    }
    _streamController.add("waiting");
    Uri uri = Uri.parse(url+textEditingController.text.trim());
      http.Response response = await http.get (uri, headers: {"Authorization": "Token " + token});
        _streamController.add(json.decode(response.body));
  }
   
   @override
  void initState() {
  
    super.initState();
    _streamController = StreamController();
    _stream=_streamController.stream;

  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.green,
        title: Text(
          "Dictionery",
          style: TextStyle(color: Colors.white),
        ),
        centerTitle: true,
        bottom: PreferredSize(
          preferredSize: Size.fromHeight(45),
          child: Row(
            children: [
              Expanded(
                child: Container(
                  margin: const EdgeInsets.only(left: 12, bottom: 11),
                  
                  decoration: 
                 
                  BoxDecoration(
                     color: Colors.white,
                    borderRadius: BorderRadius.circular(24),
                  ),
                  child: TextFormField(
                    onChanged: (String text) {
                      if (_debounce.isActive) _debounce.cancel();
                      _debounce = Timer(const Duration(milliseconds: 1000), () {
                        searchText();
                      },
                      );
                    },
                    controller: textEditingController,
                    decoration: InputDecoration(
                      hintText: "Search for Word",
                      contentPadding: const EdgeInsets.only(left: 24),
                       
                       border: InputBorder.none,

                    ),
                 ),
                ),
              ),
          IconButton(
            icon:Icon(
              Icons.search,
              color: Colors.white,
            ),
            onPressed: (){
              searchText();
              
            },
          ),
            ],
          ),
        ),
      ),
    body: Container(
      margin: EdgeInsets.all(8.0),
    
     child: StreamBuilder(
      builder:(BuildContext context, AsyncSnapshot snapshot){
        if(snapshot.data== null)
         {
           return Center(
            child: Text('Enter A Search Word'),
           );
         } 
         if(snapshot.data == "waiting"){
          return Center(
            child: CircularProgressIndicator(),
          );
         }

      return ListView.builder(
        itemCount: snapshot.data["defination"].length,
        itemBuilder: (BuildContext context , int index)
        {
            return ListBody(
              children: [
                Container(
                  color: Colors.grey[300],
                  child: ListTile(
                    leading:snapshot.data["definations"][index]["image_url"] == null
                    ? null:
                    CircleAvatar(
                      backgroundImage: NetworkImage(snapshot.data["definations"][index]["image_url"]),
                    ),
                    title: Text(textEditingController.text.trim()
                    +"(" + snapshot.data["definations"][index]["type"]+")"),
                    ),
                  ),

 Padding(
  padding: const EdgeInsets.all(8.0),
  child: Text(
    snapshot.data["defination"][index]["defination"]), 
  
  )

              ],
      );
        },
        );
        },
        stream: _stream,
       ),
      ),
     ); 
     
  }
}

当我调试这个,并触摸屏幕上的文本,它给予我错误延迟初始化

bihw5rsg

bihw5rsg1#

当前问题是_debounce尚未初始化。请将late改为可为空的Timer? _debounce;
而变化将是

child: TextFormField(
  onChanged: (String text) async {
    if (_debounce != null && _debounce!.isActive) {
      _debounce!.cancel();
      _debounce = Timer(
        const Duration(milliseconds: 1000),
        () async {
          await searchText();
        },
      );
    }
  },

完整片段

import 'dart:async';
import 'dart:convert';

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

void main() => runApp(MyApp());

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String url = "https://owlbot.info/api/v4/dictionary/";
  String token = "7ba05536bd11ff8e22800cbda80951376c59ed84";
  TextEditingController textEditingController = TextEditingController();
  late StreamController _streamController;
  late Stream _stream;
  Timer? _debounce;

  Future<void> searchText() async {
    if (textEditingController.text.isEmpty) {
      _streamController.add(null);
      return;
    }
    _streamController.add("waiting");
    Uri uri = Uri.parse(url + textEditingController.text.trim());
    http.Response response =
        await http.get(uri, headers: {"Authorization": "Token " + token});
    _streamController.add(json.decode(response.body));
  }

  @override
  void initState() {
    super.initState();
    _streamController = StreamController();
    _stream = _streamController.stream;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.green,
        title: Text(
          "Dictionery",
          style: TextStyle(color: Colors.white),
        ),
        centerTitle: true,
        bottom: PreferredSize(
          preferredSize: Size.fromHeight(45),
          child: Row(
            children: [
              Expanded(
                child: Container(
                  margin: const EdgeInsets.only(left: 12, bottom: 11),
                  decoration: BoxDecoration(
                    color: Colors.white,
                    borderRadius: BorderRadius.circular(24),
                  ),
                  child: TextFormField(
                    onChanged: (String text) async {
                      if (_debounce != null && _debounce!.isActive) {
                        _debounce!.cancel();
                        _debounce = Timer(
                          const Duration(milliseconds: 1000),
                          () async {
                            await searchText();
                          },
                        );
                      }
                    },
                    controller: textEditingController,
                    decoration: InputDecoration(
                      hintText: "Search for Word",
                      contentPadding: const EdgeInsets.only(left: 24),
                      border: InputBorder.none,
                    ),
                  ),
                ),
              ),
              IconButton(
                icon: Icon(
                  Icons.search,
                  color: Colors.white,
                ),
                onPressed: () {
                  searchText();
                },
              ),
            ],
          ),
        ),
      ),
      body: Container(
        margin: EdgeInsets.all(8.0),
        child: StreamBuilder(
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            if (snapshot.data == null) {
              return Center(
                child: Text('Enter A Search Word'),
              );
            }
            if (snapshot.data == "waiting") {
              return Center(
                child: CircularProgressIndicator(),
              );
            }

            return ListView.builder(
              itemCount: snapshot.data["defination"].length,
              itemBuilder: (BuildContext context, int index) {
                return ListBody(
                  children: [
                    Container(
                      color: Colors.grey[300],
                      child: ListTile(
                        leading: snapshot.data["definations"][index]
                                    ["image_url"] ==
                                null
                            ? null
                            : CircleAvatar(
                                backgroundImage: NetworkImage(snapshot
                                    .data["definations"][index]["image_url"]),
                              ),
                        title: Text(textEditingController.text.trim() +
                            "(" +
                            snapshot.data["definations"][index]["type"] +
                            ")"),
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Text(
                          snapshot.data["defination"][index]["defination"]),
                    )
                  ],
                );
              },
            );
          },
          stream: _stream,
        ),
      ),
    );
  }
}

相关问题