Search code examples
fluttersqflite

SQFLite DataBase Not Created


I have tried everything I know But Not been able to solve the issue

RUN Output :

Launching lib\main.dart on moto g 40 fusion in debug mode... Running Gradle task 'assembleDebug'... √ Built build\app\outputs\flutter-apk\app-debug.apk. D/FlutterLocationService(30742): Creating service. D/FlutterLocationService(30742): Binding to location service. Debug service listening on ws://127.0.0.1:51746/KGrWp8utBGI=/ws Syncing files to device moto g 40 fusion... E/SQLiteLog(30742): (1) no such table: placestore in "SELECT * FROM placestore" I/AssistStructure(30742): Flattened final assist data: 396 bytes, containing 1 windows, 3 views D/MediaScannerConnection(30742): Scanned /data/user/0/com.example.memory_place/cache/04c048c7-d58f-497c-b050-fb56e943fc1b615751689670497232.mp4 to null D/ThumbnailPlugin(30742): original w:1080, h:1920 => 150, 267 E/flutter (30742): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: FileSystemException: Cannot copy file to '/data/user/0/com.example.memory_place/app_flutter/�$��� 5�5f��O ���

======== Exception caught by gesture =============================================================== The following LateError was thrown while handling a gesture: LateInitializationError: Field '_CurrentThumbnail@643317077' has not been initialized.

When the exception was thrown, this was the stack: #0 AddScreen._CurrentThumbnail (package:memory_place/Screens/add_places_screen.dart) #1 AddScreen.build.SafePlace (package:memory_place/Screens/add_places_screen.dart:25:47) #2 AddScreen.build. (package:memory_place/Screens/add_places_screen.dart:64:15) #3 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:989:21) #4 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:198:24) #5 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:608:11) #6 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:296:5) #7 BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:230:7) #8 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:563:9) #9 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:94:12) #10 PointerRouter._dispatchEventToRoutes. (package:flutter/src/gestures/pointer_router.dart:139:9) #11 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:539:8) #12 PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:137:18) #13 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:123:7) #14 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:439:19) #15 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:419:22) #16 RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:322:11) #17 GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:374:7) #18 GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:338:5) #19 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:296:7) #20 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:279:7) #24 _invoke1 (dart:ui/hooks.dart:170:10) #25 PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:331:7) #26 _dispatchPointerDataPacket (dart:ui/hooks.dart:94:31) (elided 3 frames from dart:async) Handler: "onTap" Recognizer: TapGestureRecognizer#12cd2 debugOwner: GestureDetector state: possible won arena finalPosition: Offset(239.2, 911.2) finalLocalPosition: Offset(239.2, 11.2) button: 1 sent tap down

DB HELPER FILE:

import 'package:sqflite/sqflite.dart' as sql;
import 'package:path/path.dart' as p;

class dbHelper{

  static Future<sql.Database> DataBase() async{
    return sql.openDatabase(p.join(await sql.getDatabasesPath(),'memory_place.db'),
        onCreate: (db, version) async{
      return await db.execute('CREATE TABLE placestore(id TEXT PRIMARY KEY, title TEXT, video TEXT, thumbnail TEXT)');
    },version: 1);

  }
  static Future<void> insert(String Table,Map<String,Object> data) async{
    final db = await dbHelper.DataBase();
    db.insert(
        Table,
        data,
        conflictAlgorithm: sql.ConflictAlgorithm.replace);
  }
  static Future<List<Map<String,dynamic>>> getData(String table) async{
    final db = await dbHelper.DataBase();
    return db.query(table);
  }
}

IMAGE INPUT PAGE :

import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:path_provider/path_provider.dart' as syspath;
import 'package:path/path.dart' as p;
import 'package:video_thumbnail/video_thumbnail.dart';

class ImageInput extends StatefulWidget {
  Function onSelected;
  ImageInput({required this.onSelected});
  @override
  State<ImageInput> createState() => _ImageInputState();
}

class _ImageInputState extends State<ImageInput> {
  XFile ? _referenceXFileVid;
  File? _referenceVidFile;

  Future<void> TakePic() async{
    final _imagePicker = ImagePicker();
    final NewFile =  await _imagePicker.pickVideo(
        source: ImageSource.camera,
        maxDuration: Duration(minutes: 1));

      setState(() {
        _referenceVidFile = File(NewFile!.path);
        _referenceXFileVid = NewFile;
      });
  }

  Future<Uint8List?> VideoThumbNail(XFile Video) async{
    final uint8list = await VideoThumbnail.thumbnailData(
      video: Video.path,
      imageFormat: ImageFormat.JPEG,
      maxWidth: 150,
      quality: 25,
    );

    return await uint8list;
  }



  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        Container(
          height: 267,
          width: 150,
          alignment: Alignment.center,
          decoration: BoxDecoration(
            border: Border.all(width: 1,color: Colors.grey),
          ),
          child: _referenceVidFile!= null ?
           FutureBuilder<Uint8List?>(
               future: VideoThumbNail(_referenceXFileVid!),
               builder: (context,uint8)  {
                 if(uint8.hasData){
                   final ImagePath = uint8.data;
                   final CurrentThumbImg =  Image.memory(ImagePath!,
                   height: 267,
                   width: 150,
                   fit: BoxFit.cover,);
                   SaveVidAndThumb(_referenceVidFile!,File.fromRawPath(ImagePath));
                   return CurrentThumbImg;
                 }else{
                   return Center(child: Text('Saumya Made Mistake',textAlign: TextAlign.center,));
                 }
               }) : Text('No Video Taken',textAlign: TextAlign.center,),
        ),
        SizedBox(width: 10,),

        Expanded(
          child: FlatButton.icon(onPressed: (){
              TakePic();
          },
              icon: Icon(Icons.camera),
              label: Text('Take Video'),
              textColor: Theme.of(context).primaryColor,),
        ),
      ],
    );
  }
  void SaveVidAndThumb(File Video,File Thumbnail) async{
    final appDir = await syspath.getApplicationDocumentsDirectory();
    final VideoPath = p.basename(Video.path);
    final ThumbPath = p.basename(Thumbnail.path);
    final Savedvideo = await Video.copy('${appDir.path}/$VideoPath');
    final SavedThumb = await Thumbnail.copy('${appDir.path}/$ThumbPath');
    widget.onSelected(Savedvideo,SavedThumb);
  }
}

ADD PLACES SCREEN :

import 'dart:io';
import 'package:memory_place/models/Video_format.dart';
import 'package:memory_place/providers/place_provider.dart';
import 'package:memory_place/widgets/Location_Input.dart';
import 'package:provider/provider.dart';
import 'package:flutter/material.dart';
import 'package:memory_place/widgets/Image_Input.dart';

class AddScreen extends StatelessWidget {
 TextEditingController _TitleTextController = TextEditingController();
 late File  _CurrentVideo;
 late File _CurrentThumbnail;

 void CallCurrentImage(File CurrentVideo,File CurrentThumbnail){
   if(CurrentVideo!=null){
     _CurrentVideo = CurrentVideo;
     _CurrentThumbnail = CurrentThumbnail;
   }
 }

  @override
  Widget build(BuildContext context) {

    void SafePlace(){
      if(_TitleTextController.text == null || _CurrentThumbnail == null){
        throw Text('Either Title or Image is Missing');
      }else {
        Provider.of<PlaceProvider>(context, listen: false).AddPlace(
            _TitleTextController.text,
            _CurrentVideo,
            _CurrentThumbnail);
        Navigator.pop(context);
      }
    }

    return Scaffold(
      appBar: AppBar(
        title: Text('Add Place Screen'),
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          Expanded(
              child:SingleChildScrollView(
                child: Padding(
                  padding: EdgeInsets.all(10.0),
                  child: Column(
                    children: [
                      TextField(
                        decoration: InputDecoration(label: Text('Title...')),
                        controller: _TitleTextController,
                      ),
                      SizedBox(height: 20,),
                      ImageInput(onSelected: CallCurrentImage),
                      SizedBox(height: 20,),
                      LocationInput(),
                    ],
                  ),
                ),
              ) ),

          RaisedButton.icon(
            onPressed: (){
              SafePlace();
            },
            icon: Icon(Icons.add),
            label: Text('Add Place'),
            elevation: 0,
            materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
            color: Theme.of(context).accentColor,
          )
        ],
      ),
    );
  }
}

Solution

  • When you declare a variable as late , you are actually indicating that it won't be null.

    In your code, you're declaring_CurrentThumbnail variable as late but not instantiating it.

    You can change your AddScreen widget to StatefulWidget and instantiate _CurrentThumbnail inside initState function.(or even call CallCurrentImage inside initState)