我在嘗試從 url 接收影像時收到錯誤“無效引數:URI 檔案:/// 中未指定主機”和“StateError(錯誤狀態:DocumentSnapshotPlatform 中不存在欄位)”該用戶在應用程式中鍵入。整個螢屏提供了 BlocProvider 和 BlocBuilder 也連接了 Firebase。我注意到該錯誤可能與互聯網上的 url 格式有關。我會很感激任何幫助。我的主螢屏和添加螢屏代碼以及肘部看起來像這樣......
這是頁面視圖,用戶可以在其中看到 firebase 檔案串列:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:curlzzz_new/features/add_upcoming_movies/addd_upcoming_movies.dart';
import 'package:curlzzz_new/features/upcoming/cubit/upcoming_movies_cubit.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class UpcomingMoviesPage extends StatelessWidget {
const UpcomingMoviesPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => AddUpcomingMovie(),
fullscreenDialog: true,
),
);
},
child: const Icon(Icons.add),
),
body: BlocProvider(
create: (context) => UpcomingMoviesCubit()..start(),
child: BlocBuilder<UpcomingMoviesCubit, UpcomingMoviesState>(
builder: (context, state) {
if (state.errorMessage.isNotEmpty) {
return Text('Something went wrog: ${state.errorMessage}');
}
if (state.isLoading) {
return const Center(
child: CircularProgressIndicator(),
);
}
final documents = state.documents;
return ListView(
children: [
for (final document in documents) ...[
UpcomingMovieWidget(
document: document,
),
]
],
);
},
),
),
);
}
}
class UpcomingMovieWidget extends StatelessWidget {
const UpcomingMovieWidget({
Key? key,
required this.document,
}) : super(key: key);
final QueryDocumentSnapshot<Object?> document;
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(20.0),
margin: const EdgeInsets.all(20.0),
color: const Color.fromARGB(255, 243, 177, 198),
height: 200,
child: Column(
children: [
Container(
height: 80,
decoration: BoxDecoration(
color: Colors.black12,
image: DecorationImage(
image: NetworkImage(
document['url'],
),
fit: BoxFit.cover,
),
),
),
Container(
color: Colors.white,
height: 20,
width: 300,
child: Center(
child: Text(document['title']),
),
),
const SizedBox(
height: 20,
),
Container(
color: Colors.white,
child: Text(
(document['date'] as Timestamp).toDate().toString(),
),
)
],
),
);
}
}
這是我的肘
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:meta/meta.dart';
part 'upcoming_movies_state.dart';
class UpcomingMoviesCubit extends Cubit<UpcomingMoviesState> {
UpcomingMoviesCubit()
: super(
UpcomingMoviesState(
documents: const [],
errorMessage: '',
isLoading: false,
),
);
StreamSubscription? _streamSubscription;
Future<void> start() async {
emit(
UpcomingMoviesState(
documents: const [],
errorMessage: '',
isLoading: true,
),
);
_streamSubscription = FirebaseFirestore.instance
.collection('upcoming')
.snapshots()
.listen((data) {
emit(
UpcomingMoviesState(
documents: data.docs,
errorMessage: '',
isLoading: false,
),
);
})
..onError((error) {
emit(
UpcomingMoviesState(
documents: const [],
errorMessage: error.toString(),
isLoading: false,
),
);
});
}
@override
Future<void> close() {
_streamSubscription?.cancel();
return super.close();
}
}
這是一個添加頁面,用戶可以在其中輸入 url
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:curlzzz_new/features/add_upcoming_movies/cubit/add_upcoming_movies_cubit.dart';
import 'package:curlzzz_new/features/upcoming/cubit/upcoming_movies_cubit.dart';
import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class AddUpcomingMovie extends StatefulWidget {
AddUpcomingMovie({super.key});
@override
State<AddUpcomingMovie> createState() => _AddUpcomingMovieState();
}
class _AddUpcomingMovieState extends State<AddUpcomingMovie> {
String? _title;
String? _url;
DateTime? _date;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Add upcoming movie'),
actions: [
BlocProvider(
create: (context) => AddUpcomingMoviesCubit(),
child: BlocBuilder<AddUpcomingMoviesCubit, AddUpcomingMoviesState>(
builder: (context, state) {
return IconButton(
onPressed: _title == null || _url == null || _date == null
? null
: () {
context.read<AddUpcomingMoviesCubit>().upcoming(_title!, _url!,_date!);
},
icon: Icon(
Icons.check,
),
);
},
),
)
],
),
body: AddBody(
onTitleChanged: (newValue) {
setState(
() {
_title = newValue;
},
);
},
onUrlChanged: (newValue) {
setState(
() {
_url = newValue;
},
);
},
onDateChanged: (newValue) {
setState(
() {
_date = newValue;
},
);
},
dateFormatted: _date?.toIso8601String(),
),
);
}
}
class AddBody extends StatelessWidget {
const AddBody({
Key? key,
required this.onDateChanged,
required this.onTitleChanged,
required this.onUrlChanged,
this.dateFormatted,
}) : super(key: key);
final Function(String) onTitleChanged;
final Function(String) onUrlChanged;
final Function(DateTime) onDateChanged;
final String? dateFormatted;
@override
Widget build(BuildContext context) {
return Center(
child: Column(
children: [
TextField(
decoration: InputDecoration(
hintText: 'Titanic',
),
onChanged: onTitleChanged,
),
TextField(
decoration: InputDecoration(
hintText: 'data:image/basBAQA.jpeg',
),
onChanged: onUrlChanged,
),
ElevatedButton(
onPressed: () async {
final selectedDate = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime.now(),
lastDate: DateTime.now().add(
const Duration(days: 365 * 10),
),
);
onDateChanged(selectedDate!);
},
child: Text(dateFormatted ?? 'Choose release date'),
),
],
));
}
}
這是肘
import 'package:bloc/bloc.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:meta/meta.dart';
part 'add_upcoming_movies_state.dart';
class AddUpcomingMoviesCubit extends Cubit<AddUpcomingMoviesState> {
AddUpcomingMoviesCubit() : super(AddUpcomingMoviesState(errorMessage: ''));
Future<void> upcoming(
String title,
String url,
DateTime date,
) async {
try {
await FirebaseFirestore.instance.collection('upcoming').add({
title: 'title',
url: 'url',
date.toString(): 'date',
});
} catch (error) {
emit(AddUpcomingMoviesState(errorMessage: error.toString()));
}
}
}
uj5u.com熱心網友回復:
您只需要替換地圖的鍵和值。代替
{ 標題:'title',url:'url',date.toString():'date',}
和
{“標題”:標題,“網址”:網址,“日期”:日期,}
順便說一句,不要保存DateTime為字串。只需按原樣傳遞日期即可。它保存為 Timestamp 物件,因此您可以使用它進行查詢。檢索時僅用于map[‘date’].toDate()轉換為 DateTime 物件。
希望能幫助到你!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/517385.html
標籤:Google Cloud Collective 扑火力基地颤振块网络图像视图
下一篇:多個托管網站,只有一個后端
