Первое, что нужно отметить, вы упомянули, что хотите «перестраивать» свое приложение каждый раз, когда в тексте вносятся изменения. Чтобы это произошло, вы должны использовать StreamBuilder
. FutureBuilder
предназначено для однократного употребления, это как событие пожара и забывания или Обещание в JavaScript.
Здесь - хорошее сравнение между StreamBuilder
против FutureBuilder
.
Вот как вы должны рефакторинг вашего кода для использования StreamBuilder
.
main.dart
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyAppScreen(),
);
}
}
class MyAppScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return MyAppScreenState();
}
}
class MyAppScreenState extends State<MyAppScreen> {
StreamController<List<String>> _phobiasStream;
final TextEditingController _textEditingController = TextEditingController();
void _loadPhobias() async =>
await rootBundle.loadString('lib/phobia.txt').then((phobias) {
List<String> _listOfSortedPhobias = [];
for (String i in LineSplitter().convert(phobias)) {
for (String t in _textEditingController.text.split('')) {
if (i.split('-').first.toString().contains(t)) {
_listOfSortedPhobias.add(i);
}
}
}
_phobiasStream.add(_listOfSortedPhobias);
});
@override
void initState() {
super.initState();
_phobiasStream = StreamController<List<String>>();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: TextField(
controller: _textEditingController,
onChanged: (text) {
print("Text $text");
_loadPhobias();
},
),
),
body: StreamBuilder(
stream: _phobiasStream.stream,
builder: (context, snapshot) {
return snapshot.hasData
? Container(
height: 300,
child: ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
print("Data ${snapshot.data[index]}");
return Text(snapshot.data[index]);
},
),
)
: Center(
child: CircularProgressIndicator(),
);
},
),
);
}
}
Как видно из Код выше, я удалил ненужные обратные вызовы изменения текста внутри для l oop.
lib / phobia.txt
test1-test2-test3-test4-test5
Дайте мне знать, если это ожидаемый сценарий.
Надеюсь, это поможет.