我有一个分配,我必须将数据从mysql服务器转移到flutter中,然后将其传递给StreamBuilder,我试图使用与我们在firebase中使用的相同的类,现在我在传递已经采用的数据时遇到了问题从服务器到StreamBuilder,我记得我必须使用其他类型的快照,任何帮助。
import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Server', debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.pink, ), home: MyHomePage(title: 'Flutter Server App'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { get documents => null; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), centerTitle: true, ), ); } Future getData() async{ var url = 'https://milk-white-reveille.000webhostapp.com/get.php'; http.Response response = await http.get(url); var data = jsonDecode(response.body); print(data.toString()); } @override void initState() { getData(); } } class BookList extends StatelessWidget { @override Widget build(BuildContext context) { return new StreamBuilder( stream: _MyHomePageState.getData().snapshot(), builder: (BuildContext context, AsyncSnapshot<_MyHomePageState> snapshot) { if (snapshot.hasData) return new Text('Loading...'); return new ListView( children: snapshot.data.documents.map((document) { return new ListTile( title: new Text(document['title']), subtitle: new Text(document['type']), ); }).toList(), ); }, ); } }
新代码是这个
import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; import 'dart:async'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Server', debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.pink, ), home: MyHomePage(title: 'Flutter Server App'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { StreamController _streamController = StreamController(); Timer _timer; var data; Future getData() async { var url = 'https://milk-white-reveille.000webhostapp.com/get.php'; http.Response response = await http.get(url); String jsonsDataString = response.body.toString(); // toString of Response's body is assigned to jsonDataString data = jsonDecode(jsonsDataString); print(data.toString()); //Add your data to stream _streamController.add(data); } @override void initState() { getData(); //Check the server every 5 seconds _timer = Timer.periodic(Duration(seconds: 5), (timer) => getData()); super.initState(); } @override void dispose() { //cancel the timer if (_timer.isActive) _timer.cancel(); super.dispose(); } @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text("Home"), ), body: new _MySql() ); } } class _MySql extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: StreamBuilder( stream: _MyHomePageState()._streamController.stream, builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) return ListView( children: snapshot.data((data) { return ListTile( title: Text(data['title']), subtitle: Text(data['type']), ); }).toList(), ); return CircularProgressIndicator(); }, ), ); } }
但是在手机屏幕上正在加载…从终端出现了这个 E/flutter (10194): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: FormatException: Unexpected character (at character 1) E/flutter (10194): connected{"title":"maen","type":"dev"}
E/flutter (10194): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: FormatException: Unexpected character (at character 1) E/flutter (10194): connected{"title":"maen","type":"dev"}
如果您想与StreamBuilder定期使用它;
import 'dart:async'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Server', debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.pink, ), home: MyHomePage(title: 'Flutter Server App'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { StreamController _streamController = StreamController(); Timer _timer; Future getData() async { var url = 'https://milk-white-reveille.000webhostapp.com/get.php'; http.Response response = await http.get(url); var data = jsonDecode(response.body); //Add your data to stream _streamController.add(data); } @override void initState() { getData(); //Check the server every 5 seconds _timer = Timer.periodic(Duration(seconds: 5), (timer) => getData()); super.initState(); } @override void dispose() { //cancel the timer if (_timer.isActive) _timer.cancel(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), centerTitle: true, ), body: StreamBuilder( stream: _streamController.stream, builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) return ListView( children: snapshot.data.map((document) { return ListTile( title: Text(document['title']), subtitle: Text(document['type']), ); }).toList(), ); return Text('Loading...'); }, ), ); } }